web-dev-qa-db-ja.com

ASP.netにPage_Loadイベントの後にありますか

allPage_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コントロールにアクセスし始めます。

コードを実行する方法が必要ですafterすべてのPage_Loadイベントが発生しましたが、beforeすべてのポストバックイベント(クリックイベントなど)が発生しました:

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

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

enter image description here

After afterすべてのPage_Loadsが完了した後に上げる方法はありますか?

36
Ian Boyd

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

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

MSDNから:

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

見てみましょう:

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

enter image description here

編集1

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

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

最も簡単な方法は、ユーザーコントロールでカスタムイベントを宣言し、コントロールが読み込まれた後にそれを起動し、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();
        };
    }
61
Jupaol

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

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

それで、一般的な場合、それはあなたの運がちょうど悪いようです。

しかし、あなたの声明

その後、準備ができる前にUserControl1コントロールにアクセスし始めます

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

1
user1429080