ご存知のように、、、などのいくつかのPage_xxx
イベントハンドラーがあります。このイベントは、コントロール、ページ、およびユーザーコントロールに存在します(実際には、これらすべてのイベントを保持する派生形式です)。Init
Load
Prerender
Control
このイベントは、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ページのライフサイクル図