Я создал несколько пользовательских элементов управления - большинство из них содержит один веб-элемент управления (текстовое поле, выпадающее меню, переключатель и т. Д.) - вместе с одним или несколькими элементами проверки. Дело в том, чтобы объединить управление и проверку в одном пользовательском элементе управления.Передача ссылки веб-управления базовому классу User Control
Я создал базовый класс для этого пользовательского элемента управления с некоторой общей функциональностью - сеттеры для нескольких свойств одного веб-элемента управления, в частности CssClass и Style, которые будут установлены в элементе управления в ascx.
Например, одно текстовое поле с одним обязательным полем проверки подлинности.
Пример кода для базового класса:
public WebControl ctrl {get; set;} //allow derived class access to this
public string CssClass
{
set { ctrl.CssClass = value; } //allow CssClass to be set in the aspx page
}
Пример кода для производного класса: (в конструкторе или контролировать OnInit событие - или?)
base.ctrl = txt; //tell the base class which web control to apply common properties to.
public string ErrorMessage
{
set { val.ErrorMessage = value;} //this works !
}
Пример кода для ASCX:
<asp:TextBox ID="txt" Cssclass="input-text-m" maxlength="50" runat="server" />
<asp:RequiredFieldValidator ID="val" runat="server" ControlToValidate="txt"
ErrorMessage="">*</asp:RequiredFieldValidator>
Образец кода для aspx:
<uc:TextBox ID="ForeName" Cssclass="input-text-m" maxlength="50"
ErrorMessage="Forename" runat="server"/>
Проблема, которую я обнаружил, заключалась в том, что я не мог найти способ для производного класса установить ссылку на управление базовым классом до того, как будут вызваны средства определения свойств базовых классов. Если я устанавливаю base.ctrl в конструкторе производного класса, то ссылка на производный класс (txt) по-прежнему остается нулевой. Если я установил base.ctrl в любом из событий управления - например, OnInit - это слишком поздно.
До сих пор я столкнулся с проблемой, просто не используя базовый класс, и вместо этого вместо этого вместо этого написал код настройки свойств в классе управления пользователями, однако это означает дублирование кода, которого я пытался избежать.
Есть ли способ, чтобы сообщить базовый класс управления Я хочу, чтобы это установить свойства заранее из них установить - или я буду о вещах неправильный путь ...
Ну, ваша идея работает, хотя, кажется, что EnsureChildControls() не является необходимым в данном случае. Важным битом была идея переопределения, которая позволяет разработчикам свойств базового класса обращаться к управлению производным классом непосредственно в то время, когда это необходимо - и к этому времени контрольная ссылка (txt) больше не равна нулю. Я создал виртуальное свойство для элемента управления в базовом классе и переопредел его в производном классе следующим образом: 'code' public virtual WebControl ctrl {get; задавать; } public override WebControl ctrl {get {return txt; }} 'code' И это работает! – mearle