状況:
壊れたソリューション A:
- Page_Load: 動的に追加ボタンを作成し、クリック イベントをフックします。
- ユーザーが [追加] ボタンをクリックすると、ポストバックがトリガーされます。
- Page_Load: 通常どおり [追加] ボタンを作成し、クリック イベントをフックします。
- Page_Load: [追加] ボタンがクリックされたことをまだ認識していないため、ユーザー コントロールを生成することを認識していません。
- AddButton_Click: ページは、次の Page_Load で新しいユーザー コントロールを追加する必要があることを最終的に認識します。
- 別の Page_Load がトリガーされたため、ユーザーは追加したコントロールを表示できません。
- ユーザーは、ボタンをクリックしたり、ページを更新したりして、ページをリロードします。
- Page_Load: 追加ボタンを作成し、クリック イベントをフックします。追加されたユーザー コントロールを認識し、ユーザー コントロールを作成します。ユーザー コントロール内のイベントをフックします。
- ユーザーがユーザー コントロール内のボタンをクリックすると、問題なくトリガーされます。
結果: ユーザーはクリックして新しいユーザー コントロールを追加します。サーバーはコントロールが存在する必要があることを認識しますが、ユーザーがページを再度読み込むまで (別のボタンをクリックするか、更新するなどして) コントロールを表示しません。
当然、ライフ サイクルを調べたところ、Page_LoadComplete はイベントの後に発生することがわかりました。したがって、Page_LoadComplete にイベント依存のコードを配置すれば、すべてうまくいくはずです。
壊れたソリューション B:
- Page_LoadComplete: [追加] ボタンを動的に作成し、クリック イベントをフックします。
- ユーザーが [追加] ボタンをクリックすると、ポストバックがトリガーされます。
- Page_LoadComplete: 通常どおり [追加] ボタンを作成し、クリック イベントをフックします。
- AddButton_Click: 次の Page_LoadComplete で新しいユーザー コントロールを追加する必要があることを認識したページ。
- Page_LoadComplete: ボタン クリックを認識し、独自の内部ボタン クリック イベントを使用してコントロールを動的に追加します。
- ユーザーは、追加されたユーザー コントロール内のボタンをクリックしますが、トリガーされません!!
結果: 追加されたユーザー コントロール内のボタンが無効であることを除いて、すべてがうまく機能します。
難問は、ボタンのクリックでコントロールを生成する必要があるということです。つまり、Controls.Add(...)
コードを Page_LoadComplete に配置する必要があります。逆に、コントロールを追加してイベントを機能させる必要があります。つまり、Controls.Add(...)
コードは Page_Load にある必要があります。私は完璧な二分法を持っています。
私が考えることができる唯一の厄介な解決策は、解決策 A を採用し、[追加] ボタンをクリックした後にページを手動でリロードすることです。これは、帯域幅と処理の無駄です。