2011-12-20 4 views
0

Я создал несколько пользовательских элементов управления - большинство из них содержит один веб-элемент управления (текстовое поле, выпадающее меню, переключатель и т. Д.) - вместе с одним или несколькими элементами проверки. Дело в том, чтобы объединить управление и проверку в одном пользовательском элементе управления.Передача ссылки веб-управления базовому классу 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 - это слишком поздно.

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

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

ответ

0

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

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

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

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

+0

Ну, ваша идея работает, хотя, кажется, что EnsureChildControls() не является необходимым в данном случае. Важным битом была идея переопределения, которая позволяет разработчикам свойств базового класса обращаться к управлению производным классом непосредственно в то время, когда это необходимо - и к этому времени контрольная ссылка (txt) больше не равна нулю. Я создал виртуальное свойство для элемента управления в базовом классе и переопредел его в производном классе следующим образом: 'code' public virtual WebControl ctrl {get; задавать; } public override WebControl ctrl {get {return txt; }} 'code' И это работает! – mearle