0

1つ以上の検証コントロールとともに、いくつかのユーザーコントロール(ほとんどが単一の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)はこの時点ではまだnullです。いずれかのコントロールイベント(OnInitなど)でbase.ctrlを設定した場合、これは遅すぎます。

これまでのところ、基本クラスを使用せず、代わりにユーザーコントロールクラスにプロパティセッターコードを記述することで問題を回避しましたが、これはコードの重複を意味し、回避しようとしていました。

コントロールの基本クラスに、プロパティが設定される前にプロパティを設定するように通知する方法はありますか?または、間違った方法で処理を行っていますか?

4

1 に答える 1

0

get / set操作の前に呼び出しEnsureChildControlsて、ctrl = txtのset操作を含めるのはEnsureChildControlsどうですか?これは通常のservercontrolのかなり標準的な方法であり、UserControlでも機能すると思います。

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

オーバーライドEnsureChildControlsして、baseへの呼び出しを残し、baseへctrl = txt;の呼び出しの後にここに設定します。

詳細情報: http: //msdn.microsoft.com/en-us/library/system.web.ui.control.ensurechildcontrols.aspx

于 2011-12-20T20:14:44.367 に答える