0

状況:

  • フックされたイベントを持つボタンを持つユーザー コントロールがあります。イベントを持つコントロールは、Page_Load 以前で初期化する必要があります。
  • [追加] ボタンをクリックして、これらのユーザー コントロールを動的に生成したいと考えています。
  • クリック イベントなどのイベントは、Page_LoadComplete の直前まで発生しないことに注意してください。

  • 壊れたソリューション A:

    1. Page_Load: 動的に追加ボタンを作成し、クリック イベントをフックします。
    2. ユーザーが [追加] ボタンをクリックすると、ポストバックがトリガーされます。
    3. Page_Load: 通常どおり [追加] ボタンを作成し、クリック イベントをフックします。
    4. Page_Load: [追加] ボタンがクリックされたことをまだ認識していないため、ユーザー コントロールを生成することを認識していません。
    5. AddButton_Click: ページは、次の Page_Load で新しいユーザー コントロールを追加する必要があることを最終的に認識します。
    6. 別の Page_Load がトリガーされたため、ユーザーは追加したコントロールを表示できません。
    7. ユーザーは、ボタンをクリックしたり、ページを更新したりして、ページをリロードします。
    8. Page_Load: 追加ボタンを作成し、クリック イベントをフックします。追加されたユーザー コントロールを認識し、ユーザー コントロールを作成します。ユーザー コントロール内のイベントをフックします。
    9. ユーザーがユーザー コントロール内のボタンをクリックすると、問題なくトリガーされます。

    結果: ユーザーはクリックして新しいユーザー コントロールを追加します。サーバーはコントロールが存在する必要があることを認識しますが、ユーザーがページを再度読み込むまで (別のボタンをクリックするか、更新するなどして) コントロールを表示しません。

    当然、ライフ サイクルを調べたところ、Page_LoadComplete はイベントの後に発生することがわかりました。したがって、Page_LoadComplete にイベント依存のコードを配置すれば、すべてうまくいくはずです。

    壊れたソリューション B:

    1. Page_LoadComplete: [追加] ボタンを動的に作成し、クリック イベントをフックします。
    2. ユーザーが [追加] ボタンをクリックすると、ポストバックがトリガーされます。
    3. Page_LoadComplete: 通常どおり [追加] ボタンを作成し、クリック イベントをフックします。
    4. AddButton_Click: 次の Page_LoadComplete で新しいユーザー コントロールを追加する必要があることを認識したページ。
    5. Page_LoadComplete: ボタン クリックを認識し、独自の内部ボタン クリック イベントを使用してコントロールを動的に追加します。
    6. ユーザーは、追加されたユーザー コントロール内のボタンをクリックしますが、トリガーされません!!

    結果: 追加されたユーザー コントロール内のボタンが無効であることを除いて、すべてがうまく機能します。

    難問は、ボタンのクリックでコントロールを生成する必要があるということです。つまり、Controls.Add(...)コードを Page_LoadComplete に配置する必要があります。逆に、コントロールを追加してイベントを機能させる必要があります。つまり、Controls.Add(...)コードは Page_Load にある必要があります。私は完璧な二分法を持っています。

    私が考えることができる唯一の厄介な解決策は、解決策 A を採用し、[追加] ボタンをクリックした後にページを手動でリロードすることです。これは、帯域幅と処理の無駄です。

    4

    1 に答える 1

    0

    これはベスト プラクティスではないかもしれませんがRequest.Form、Page_Init イベント中に追加ボタンがクリックされた証拠を確認し、そこにコントロールを追加することができます。それはあなたの問題を解決するはずです。

    于 2010-09-01T23:18:45.297 に答える