39

すべての Page_Loadイベントが完了した後にトリガーされるイベントはありますか?

どうすれば複数持つことができPage_Loadますか?
ユーザーコントロールがある場合。

ページをレンダリングする前に、ページ (およびすべての埋め込みコントロール) をPage_Loadイベントを完了して初期化する必要があります。

もちろん、問題は、ページのPage_Loadハンドラーにコードを配置した場合です。

MyPage.aspx
   --> Page_Load
          ---> DoSomethingWithUserControl()
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored

次に、UserControl1準備が整う前にコントロールにアクセスし始めます。

すべてのイベントが発生した、ポストバック イベント (例: Click イベント) が発生する前にコードを実行する方法が必要です。Page_Load

MyPage.aspx
   --> Page_Load
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
   --> Page_AfterLoad
          ---> DoSomethingWithUserControl()

MSDN のページ ライフサイクルを見ると、すべての Page_Loads が完了した後にイベントを発生させる方法がないように見えます。

ここに画像の説明を入力

すべての Page_Loads が完了した後に発生させる方法はありますか?

4

2 に答える 2

65

Page_LoadCompleteすべてのコントロールがロードされた後に発生するイベントです

イベントInitは最初にすべての子コントロールによってトリガーされ、すべてのコントロールが初期化されたときInitに、ページのイベントが発生することに注意してください。イベントはLoad逆に機能し、ページが最初にLoadイベントを発生させ、次に各子コントロールが独自のLoadイベントを発生させます。最後にLoadCompleteが上げられます。これは、コントロールが設計時に作成される場合にのみ当てはまることに注意してください。コントロールが動的に作成される場合、(悲しいことに) このアプローチに厳密には従わないことに注意してください。

MSDN から:

コントロールが実行時に動的に作成されるか、データ バインド コントロールのテンプレート内で宣言的に作成される場合、それらのイベントは最初はページ上の他のコントロールのイベントと同期されません。たとえば、実行時に追加されるコントロールの場合、Init および Load イベントは、宣言的に作成されたコントロールの同じイベントよりも、ページのライフ サイクルのかなり後で発生する可能性があります。したがって、それらがインスタンス化された時点から、動的に追加されたコントロールとテンプレート内のコントロールは、Controls コレクションに追加されたイベントに追いつくまで、次々にイベントを発生させます。

見てみましょう:

(ソース: http://msdn.microsoft.com/en-us/library/ms178472.aspx )

ここに画像の説明を入力

編集 1

すべての要件を満たすには:

すべての Page_Load イベントが発生した後で、ポストバック イベント (例: Click イベント) が発生する前にコードを実行する方法が必要です。

最も簡単な方法は、ユーザー コントロールでカスタム イベントを宣言し、コントロールが読み込まれた後にそれを起動し、ASPX でそのイベントをサブスクライブすることだと思います。

ユーザーコントロール

    public event Action LoadCompleted = delegate { };

    protected void Page_Load(object sender, EventArgs e)
    {
        this.LoadCompleted();
    }

ASPXページ

    protected void Page_Load(object sender, EventArgs e)
    {
        this.myUserControl.LoadCompleted += () => 
        {
            // do somethign interesting
            this.lblMessage.Text = DateTime.Now.ToString();
        };
    }
于 2012-06-27T21:28:32.113 に答える
1

すべての(静的に宣言された、動的に追加されたJupaolsのコメントを参照)コントロールがロードされてから、それらのポストバックイベントが発生するまでの間にコードを確実に実行する方法はないようです。

リフレクターを使用して Page クラスを逆アセンブルすることさえしましたが、私が知る限り、ページはこれらの時間の間に利用できるメソッドを呼び出していません。

したがって、一般的なケースでは、運が悪いだけのようです。

でもあなたの発言は

次に、準備が整う前に UserControl1 コントロールへのアクセスを開始します

疑問です。メソッドが呼び出されるまでPage_Loadに、ビューステートとコントロールの状態がすべてのコントロール (少なくとも静的に宣言されたもの) に設定されています。したがって、コントロールの OnLoad メソッドでさらに状態の初期化を行っていない限り、コントロールをいじる準備ができています。OnLoad で何かが起こっている場合は、そこでいじってみませんか?

于 2012-06-28T10:21:32.787 に答える