Frage

I created several user controls - most containing a single web control (text box, drop down, radio button etc) - along with one or more validation controls. The point being to combine control and validation in a single user control.

I created a base class for these user control with some common functionality - setters for several properties of a single web control, specifically CssClass and Style to be set in the control in the ascx.
Eg a single text box with a single required field validator.

Sample code for the base class:

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
}

Sample code for derived class: (in constructor or control OnInit Event - or ?)

base.ctrl = txt;    //tell the base class which web control to apply common properties to.

public string ErrorMessage
{
    set { val.ErrorMessage = value;}    //this works !
}

Sample code for ascx:

<asp:TextBox ID="txt" Cssclass="input-text-m" maxlength="50" runat="server" />
<asp:RequiredFieldValidator ID="val" runat="server" ControlToValidate="txt" 
    ErrorMessage="">*</asp:RequiredFieldValidator>

Sample code for aspx:

<uc:TextBox ID="ForeName" Cssclass="input-text-m" maxlength="50" 
ErrorMessage="Forename" runat="server"/>

The problem I found was that I couldn't find a way for the derived class to set the base class web control reference before the base classes property setters are called. If I set base.ctrl in the derived class constructor - then the derived class control reference (txt) is still null at this point. If I set base.ctrl in any of the control events - eg OnInit - then this is too late.

So far I have got around the problem by simply not using a base class, and writing the property setter code in the user control class instead, however this means duplication of code, which I was trying to avoid.

Is there a way to inform the base class of the control I want it to set the properties for in advance of them being set - or am I going about things the wrong way...

War es hilfreich?

Lösung

What about calling EnsureChildControls before any get/set operations and including the set operation for ctrl = txt in EnsureChildControls? This is pretty standard practice for a normal servercontrol, I would think it would work for UserControls too.

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

Override EnsureChildControls, leaving in the call to base, and set ctrl = txt; here after the call to base.

More information: http://msdn.microsoft.com/en-us/library/system.web.ui.control.ensurechildcontrols.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top