ほとんどの場合、1つまたは複数の検証コントロールとともに、単一のWebコントロール(テキストボックス、ドロップダウン、ラジオボタンなど)を含む複数のユーザーコントロールを作成しました。ポイントは、単一のユーザーコントロールで制御と検証を組み合わせることです。WebコントロールリファレンスをUser Controlベースクラスに渡す
私は、単一のWebコントロールのいくつかのプロパティ(特に、CssClassとStyleをascxのコントロールに設定する)のいくつかの共通機能を持つユーザーコントロールの基本クラスを作成しました。
たとえば、1つの必須フィールドバリデーターを持つ単一のテキストボックス。
基底クラスのサンプルコード:
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のサンプルコード:
私が見つけた問題は、基本クラスのプロパティの設定が呼び出される前に、派生クラスが基本クラスのWebコントロール参照を設定する方法を見つけることができなかったことでした。 派生クラスのコンストラクタでbase.ctrlを設定した場合、派生クラスコントロール参照(txt)はまだこの時点でnullです。 コントロールイベントのいずれかにbase.ctrlを設定した場合(OnInitなど)、これは遅すぎます。
これまでのところ、単純に基本クラスを使用せずに、代わりにユーザーコントロールクラスにプロパティ設定コードを書き込むことで問題を回避しましたが、これは回避しようとしていたコードの重複を意味します。
私はそれが設定されている彼らの前にするためのプロパティを設定するコントロールの基本クラスで通知する方法がある - または私は物事を間違った道を進んでいますが...
まあ、EnsureChildControls()は、この場合には必要ではないようですが、あなたのアイデアは、動作します。 重要なビットはオーバーライドのアイデアでした。基本クラスのプロパティ設定ツールは、必要なときに派生クラスコントロールに直接アクセスすることができ、今度はコントロール参照(txt)はnullになりません。 ベースクラスのコントロールの仮想プロパティを作成し、派生クラスで次のようにオーバーロードしました。 'code' public virtual WebControl ctrl {get;セット; } パブリックオーバーライドWebControl ctrl {get {return txt; }} 'code' これは治療法です! – mearle