Передача ссылки на веб-элемент управления в базовый класс User Control - PullRequest
0 голосов
/ 20 декабря 2011

Я создал несколько пользовательских элементов управления, большинство из которых содержат один веб-элемент управления (текстовое поле, раскрывающийся список, переключатель и т. Д.), А также один или несколько элементов проверки.Смысл в том, чтобы объединить управление и проверку в одном пользовательском элементе управления.

Я создал базовый класс для этих элементов управления с некоторыми общими функциями - установщиками для нескольких свойств одного веб-элемента управления, в частности 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 - тогда это будет слишком поздно.

Пока что я справился с проблемой, просто не используя базовый класс и записывая код установщика свойстввместо этого в классе пользовательского элемента управления, однако это означает дублирование кода, которого я пытался избежать.

Есть ли способ сообщить базовому классу элемента управления, для которого я хочу установить свойства заранееих устанавливают - или я поступаю неправильно ...

1 Ответ

0 голосов
/ 21 декабря 2011

Как насчет вызова EnsureChildControls перед любыми операциями get / set и включения операции set для ctrl = txt в EnsureChildControls?Это довольно стандартная практика для обычного управления сервером, я думаю, он будет работать и для UserControls.

public string CssClass {   set { EnsureChildControls(); ctrl.CssClass = value; } } 

Переопределить EnsureChildControls, оставив в вызове базу, и установить ctrl = txt; здесь после вызована базу.

Дополнительная информация: http://msdn.microsoft.com/en-us/library/system.web.ui.control.ensurechildcontrols.aspx

...