0

我创建了几个用户控件——大多数包含一个 Web 控件(文本框、下拉菜单、单选按钮等)——以及一个或多个验证控件。关键是将控制和验证结合在一个用户控件中。

我为这些用户控件创建了一个具有一些通用功能的基类 - 单个 Web 控件的多个属性的设置器,特别是要在 ascx 中的控件中设置的 CssClass 和 Style。
例如,带有单个必填字段验证器的单个文本框。

基类的示例代码:

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"/>

我发现的问题是,在调用基类属性设置器之前,我找不到派生类设置基类 Web 控件引用的方法。如果我在派生类构造函数中设置 base.ctrl - 那么派生类控件引用(txt)此时仍然为空。如果我在任何控制事件中设置 base.ctrl - 例如 OnInit - 那么这为时已晚。

到目前为止,我已经解决了这个问题,只是不使用基类,而是在用户控件类中编写属性设置器代码,但这意味着代码重复,这是我试图避免的。

有没有办法通知控件的基类我希望它在设置属性之前设置它们 - 或者我是否以错误的方式处理事情......

4

1 回答 1

0

EnsureChildControls在任何 get/set 操作之前调用并包括 ctrl = txt in 的 set 操作EnsureChildControls怎么样?这对于普通的服务器控件来说是非常标准的做法,我认为它也适用于 UserControls。

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

Override EnsureChildControls,保留在对 base 的调用中,并在ctrl = txt;调用 base 之后设置在这里。

更多信息:http: //msdn.microsoft.com/en-us/library/system.web.ui.control.ensurechildcontrols.aspx

于 2011-12-20T20:14:44.367 回答