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が完了しました。
After afterすべてのPage_Loadsが完了した後に上げる方法はありますか?
Page_LoadComplete
は、すべてのコントロールがロードされた後に発生するイベントです
Init
イベントは最初にすべての子コントロールによってトリガーされ、すべてのコントロールが初期化されると、ページのInit
イベントが発生することに注意してください。 Load
イベントは逆に機能し、ページは最初にLoad
イベントを発生させ、次に各子コントロールが独自のLoad
イベントを発生させます。最後にLoadComplete
が発生します。 これは、コントロールが設計時に作成される場合にのみ当てはまることに注意してください。コントロールが動的に作成される場合、(残念ながら)厳密にこのアプローチを行いません。
MSDNから:
コントロールが実行時に動的に作成される場合、またはデータバインドコントロールのテンプレート内で宣言的に作成される場合、それらのイベントは最初はページ上の他のコントロールのイベントと同期されません。たとえば、実行時に追加されるコントロールの場合、InitイベントとLoadイベントは、ページライフサイクルの同じイベントよりもはるかに遅く発生する可能性があります宣言的に作成されたコントロール。したがって、インスタンス化された時点から、動的に追加されたコントロールとテンプレート内のコントロールは、Controlsコレクションに追加されたイベントに追いつくまで、イベントを次々に発生させます。
見てみましょう:
(ソース: http://msdn.Microsoft.com/en-us/library/ms178472.aspx )
すべての要件を満たすために:
すべてのPage_Loadイベントが発生した後、ポストバックイベント(クリックイベントなど)が発生する前にコードを実行する方法が必要です。
最も簡単な方法は、ユーザーコントロールでカスタムイベントを宣言し、コントロールが読み込まれた後にそれを起動し、ASPXでそのイベントをサブスクライブすることだと思います
public event Action LoadCompleted = delegate { };
protected void Page_Load(object sender, EventArgs e)
{
this.LoadCompleted();
}
protected void Page_Load(object sender, EventArgs e)
{
this.myUserControl.LoadCompleted += () =>
{
// do somethign interesting
this.lblMessage.Text = DateTime.Now.ToString();
};
}
すべての(静的に宣言された、動的に追加されたJupaolsのコメントを参照)コントロールが読み込まれてからポストバックイベントが発生するまでの間、コードを確実に実行する方法は本当にないようです。
リフレクターを使用してPageクラスを逆アセンブルすることもできましたが、私が知る限り、ページはこれらの時間の間に利用できるメソッドを呼び出していません。
それで、一般的な場合、それはあなたの運がちょうど悪いようです。
しかし、あなたの声明
その後、準備ができる前にUserControl1コントロールにアクセスし始めます
疑わしい。 Page_Load
メソッドが呼び出され、すべてのコントロール(少なくとも静的に宣言されたもの)でビューステートとコントロール状態が設定されています。したがって、コントロールのOnLoadメソッドで状態の初期化をさらに行わない限り、コントロールをいじることができます。 OnLoadで何かを実行している場合は、そこをいじってみませんか?