ご存知のように、、、などのいくつかのPage_xxxイベントハンドラーがあります。このイベントは、コントロール、ページ、およびユーザーコントロールに存在します(実際には、これらすべてのイベントを保持する派生形式です)。InitLoadPrerenderControl
このイベントは、ASP.NETページのライフサイクルに関連しています
このリンクが指すページを注意深く読むと、イベントがいつトリガーされるかがわかります。したがって、イベントがトリガーされる前に発生するページライフサイクルイベントでイベントハンドラーをバインドすると、イベントハンドラーがトリガーされる時間内にバインドされることが保証されます。
これらは主なライフサイクルステップです:
PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] ->
LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload
それらのすべてに関連するイベントがあるわけではありませんが、必要に応じて、のOnXxx()ような対応する関数をオーバーライドできますOnPreInit()。(これは通常、カスタムサーバーコントロールでのみ実行されます)。
すべてのコントロールのロードが完了した後にコントロールイベントがトリガーされるため、Page_InitまたはでイベントをバインドできますPage_Load。このLoadステップは、最初はページで、次にすべての子コントロールで再帰的に上下に行われます。
終了後Load、トリガーされる最初のイベントは、TextChangedまたはのような変更イベントSelectionChangedです。次に、のような他のすべてのイベントがトリガーされますClick。
PreRenderまたはUnloadでイベントをバインドした場合、それらはトリガーされません。InitまたはLoadで行った場合、それらは。
したがって、InitまたはLoadでバインドするのは安全に見えるかもしれませんが、それは真実ではありません:
これらはページのライフサイクルの後半でトリガーされるため、Initまたはにバインドする特別な理由はないように見える場合があります。Loadただし、で定義されたバインディングは.aspx中に発生Initするため、プログラマーはすべてのイベントがすでにイベントでバインドされていることを期待しますLoad。このプログラマーがコードビハインドで子コントロールのイベントを発生させたらどうなるでしょうか。イベントは最初にコントロールツリーのLoadルートで発生し、すべての子で再帰的に発生します。したがって、プログラマーが子コントロールのイベントを発生させようとしているときには、それはまだバインドされていません。したがって、これは期待どおりに機能しません。これは、イベントでイベントをバインドするのが安全でないと考えるには十分すぎるほどLoadです。そのため、常にイベントをバインドする必要がありますInit。
次の図を見て、ページと子のイベントの実行順序を確認してください
。ASP.NETページのライフサイクル図