複合コントロールのフローでは、特定の時点で子コントロールを作成する必要があるためです。私は他の人も同様に抱えていたに違いないと思う問題を抱えています。
私のコントロールは、複合「コンテナ/コレクション」コントロールです。オブジェクトが供給され、そのオブジェクト データに基づいて、多数の子コントロールが作成されます。したがって、私のコントロールはヘッダー (常に) と x-number の TextBox コントロールを (供給されたオブジェクトに基づいて) レンダリングします。
私は明らかに CreateChildControls() でヘッダーを作成していますが、(TextBoxes のベースとなる) オブジェクトがまだフィードされているかどうかがわからないため、そこに TextBoxes を作成することはできませんか? オブジェクトを設定/フィードするプロパティ/メソッドを公開することを考えましたが、いつ呼び出されるかわかりません。
それで、私は何をしますか?CreateChildControls() で TextBoxes を作成できない可能性がありますか? つまり、CreateChildControls() がいつ呼び出されるか - 私は、EnsureChildControls() を呼び出すことができることを知っています (これは、ヘッダーの innerText を設定するプロパティで既に行っています - 明らかに innerText を設定する前にヘッダーを作成する必要があるため)。
これはどう
var c = new MyContainerControl();
c.Header = "fun";
c.TextBoxObject = myTextBoxes;
CreateChildControls() に TextBox の構築を配置すると、エラーが発生します (または、せいぜい TextBox を作成しません)。
代わりに、ヘッダーをメンバー変数に格納するだけで、ヘッダーのinnerTextを設定する公開されたメソッド/プロパティでEnsureChildControls()を呼び出す必要がなくなります。私はこのアプローチがあまり好きではありません.一時的に保存するために余分なロジックを追加し、後でそれをいつ設定するか(おそらくPreRenderで)を把握しなければならないため、物事が複雑になるからです.
また、ある種の Databound コントロールを作成して、.DataBind() の呼び出し時にデータが存在するようにすることもできると思います。前回、データバインドされたコントロールの作成を見たとき、非常に複雑になったので、これも本当に好きではありません。
これは本当に簡単に解決できるはずです-どこかで何かが足りないことはわかっています...