すべての動的に作成されたコントロールは、Page_Initの最後に追加する必要があります(ただし、Page_Loadの末尾に追加されることもあります)。
ボタンクリックイベントに基づいて追加する場合は、ライフサイクルでPage_InitおよびPage_Loadを発生させるイベントハンドラでこれを実行します。これがイベントが発生しない理由と動作する理由ですデザイン時に追加するときれいになります。
これは、2番目のユーザーコントロールでボタンをクリックすると、ページライフサイクル全体が再び開始されるためです。ページはPage_LoadとPage_Initを最初に通過し、コントロールはここでロードされません。したがって、ページライフサイクルが「ハンドルポストバックイベント」の部分を処理するとき、コントロールは実際には存在しないので、イベントは発生しません。
逆に、デザインタイムに追加すると、Page_InitとPage_Loadにコントロールが存在するため、コントロールツリーに既に存在するので、ユーザーコントロールからポストバックイベントを処理できるようになります。
Page_Loadが最後に完了するまでに追加されるように再構成する方法を考える必要があります。コードサンプルや詳細がなければ、これを行う方法を正確に示唆するのは難しいです。 1つの可能性は、それを完全にロードするのではなく、目に見えるように設定することです。しかし、コントロールがデータベースのヒットやAPIコールのように負荷が重い場合、これはあなたには適していない可能性があります。
私は同様のことをしました。私がしたのは、DropDownList
からの選択に基づいていくつかのコントロールを動的にロードすることでした。あなたはあなたのためのコントロールをロードする方法を持っている場合、あなたはこのような何か行うことができます、のはLoadControls()
それを呼びましょう:ViewStateの変数を設定することにより
DropDownList_Click {
ViewState("LoadControls") = true;
LoadControls()
}
を、あなたは、将来のポストバックのコントロールをロードするためのPage_Loadを示すことができ:
Page_Load {
if (ViewState("LoadControls") == "true")
{
LoadControls();
}
}
次いで、これをライフサイクルの将来の時点で、イベントが最初に発生したときにオンザフライで、及びコントロールをロードする効果を有します。
いくつかのコードを投稿できますか? – Strillo
ご利用のコードをお知らせください。 –
どのようなコードが必要ですか? –