我創建幾個用戶控件 - 大多數含有單個網頁控制(文本框,下拉,單選按鈕等) - 沿着與一個或多個驗證控件。關鍵是將控制和驗證結合在一個用戶控制中。傳遞網絡控制參考用戶控件基類
我創建了一些常見功能的這些用戶控制一個基類 - setter方法單個Web控制的幾個屬性,具體的CssClass和樣式以在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事件 - 或?)對於ASCX
base.ctrl = txt; //tell the base class which web control to apply common properties to.
public string ErrorMessage
{
set { val.ErrorMessage = value;} //this works !
}
示例代碼:
<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 - 那麼這太遲了。
到目前爲止,我已經通過簡單地不使用基類,並在用戶控件類中編寫屬性設置器代碼來解決這個問題,但這意味着代碼的重複,這是我試圖避免的。
有沒有辦法通知基類,我希望它在他們提前設定的屬性被設置的控制 - 還是我處理事情的方式不對......
那麼,你的思想工作,但它似乎EnsureChildControls()沒有必要在這種情況下。 重要的一點是覆蓋思想,它允許基類屬性設置器在需要時直接訪問派生類控件 - 此時,控件引用(txt)不再爲空。 我爲基類中的控件創建了一個虛擬屬性,並在派生類中覆蓋它,如下所示: 'code' public virtual WebControl ctrl {get;組; } public override WebControl ctrl {get {return txt; }} 'code' 而且,這是一種享受! – mearle 2011-12-21 15:25:16