これが .Net のすべてのバージョンに当てはまるかどうかはわかりませんが (2.0 以降だと思います)、ライフサイクルの一部ではない CreateChildControls というメソッドがあります。基本的には、EnsureChildControls メソッドが呼び出されるたびに呼び出されます。デフォルトでは、ポストバックでない場合、PreRender の前に呼び出されます。したがって、基本的にコードは次のようになります。
public class SomeControl : WebControl, INamingContainer
{
private TextBox someTextBox;
protected override void CreateChildControls()
{
base.CreateChildControls();
someTextBox= new TextBox();
someTextBox.ID = "tbxMain";
Controls.Add(textboxToCheck);
}
}
ここで注意すべき点は、EnsureChildControls を呼び出さない限り、コントロールのパブリック プロパティが ViewState の読み込みによって満たされる前に、コントロールが存在することを 100% 確信できないということです。これは何を意味するのでしょうか?前のコードを参考にして、CssClass のプロパティを追加します。
public class SomeControl : WebControl, INamingContainer
{
private TextBox someTextBox;
protected override void CreateChildControls()
{
base.CreateChildControls();
someTextBox= new TextBox();
someTextBox.ID = "tbxMain";
Controls.Add(textboxToCheck);
}
public String CssClass { get; set; }
}
CreateChildControls では、これは必要ありません。
someTextBox.CssClass = CssClass;
コントロールがまだ存在することを確認する方法がないためです。これを処理するには、いくつかの方法があります。
public String CssClass {get {EnsureChildControls(); someTextbox.CssClass を返します。}
set
{
EnsureChildControls();
someTextbox.CssClass = value;
}
この例では、EnsureChildControls を呼び出し (CreateChildControls メソッドでテキスト ボックスに CssValue を設定していると仮定)、テキスト ボックスを設定または取得しています。
もう 1 つの方法は、コントロールのパブリック プロパティに依存するものを OnPreRender メソッドに入れることです。
protected override void OnPreRender(EventArgs e)
{
someTextbox.CssClass = CssClass;
}
したがって、ViewState の読み込み中にプロパティが既に満たされていることを心配する混乱を回避できます。
1 つのメモ:
INamingContainer の使用は重要な場合があります。基本的には、親の名前 (およびおそらくそれ以上) を ID に適用することにより、親コントロールのコントロールがページ上で一意の ID を持つようにするだけです。基本的に、親 ID が Parent で子コントロール ID が Child の場合、ID は Parent_Child として表示される可能性があります。これにより、ViewState でプロパティが正しく設定されない、またはまったく設定されないという問題が解決されます。