2011-12-20 80 views
0

我創建幾個用戶控件 - 大多數含有單個網頁控制(文本框,下拉,單選按鈕等) - 沿着與一個或多個驗證控件。關鍵是將控制和驗證結合在一個用戶控制中。傳遞網絡控制參考用戶控件基類

我創建了一些常見功能的這些用戶控制一個基類 - 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 - 那麼這太遲了。

到目前爲止,我已經通過簡單地不使用基類,並在用戶控件類中編寫屬性設置器代碼來解決這個問題,但這意味着代碼的重複,這是我試圖避免的。

有沒有辦法通知基類,我希望它在他們提前設定的屬性被設置的控制 - 還是我處理事情的方式不對......

回答

0

什麼叫EnsureChildControls在任何獲取/設置操作之前,包括在ctrl = txt的設置操作EnsureChildControls?這對於普通的servercontrol來說是非常標準的做法,我認爲它也適用於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

+0

那麼,你的思想工作,但它似乎EnsureChildControls()沒有必要在這種情況下。 重要的一點是覆蓋思想,它允許基類屬性設置器在需要時直接訪問派生類控件 - 此時,控件引用(txt)不再爲空。 我爲基類中的控件創建了一個虛擬屬性,並在派生類中覆蓋它,如下所示: 'code' public virtual WebControl ctrl {get;組; } public override WebControl ctrl {get {return txt; }} 'code' 而且,這是一種享受! – mearle 2011-12-21 15:25:16