Я создал несколько пользовательских элементов управления, большинство из которых содержат один веб-элемент управления (текстовое поле, раскрывающийся список, переключатель и т. Д.), А также один или несколько элементов проверки.Смысл в том, чтобы объединить управление и проверку в одном пользовательском элементе управления.
Я создал базовый класс для этих элементов управления с некоторыми общими функциями - установщиками для нескольких свойств одного веб-элемента управления, в частности 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 Event - или?)
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"/>
TheПроблема, которую я обнаружил, заключалась в том, что я не смог найти способ для производного класса установить ссылку на веб-элемент управления базового класса перед вызовом установщиков свойств базовых классов.Если я установлю base.ctrl в конструкторе производного класса - тогда ссылка на производный класс управления (txt) все еще будет нулевой в этой точке.Если я установлю base.ctrl в каком-либо из событий управления - например, OnInit - тогда это будет слишком поздно.
Пока что я справился с проблемой, просто не используя базовый класс и записывая код установщика свойстввместо этого в классе пользовательского элемента управления, однако это означает дублирование кода, которого я пытался избежать.
Есть ли способ сообщить базовому классу элемента управления, для которого я хочу установить свойства заранееих устанавливают - или я поступаю неправильно ...