6

テキストボックスとボタンを備えたかなり標準的なフォームがあるとしましょう(簡単にするため)。Clickイベントを処理し、ユーザーの入力に基づいていくつかのことを実行したいとします。

疑問に思っていたのですが、コードビハインドでClickイベントのイベントハンドラーを正確に接続するのはいつですか?もしそうなら、それを置くのに最適な場所はどこですか?ページの読み込み?ページ初期化?私は両方の場所を試しましたが、違いはわかりませんでした。それとも、プログラマーの個人的な好みですか?私はすでにインターネットを数回検索しましたが、満足のいく答えは見つかりませんでした。

実際のメソッドがいつ実行されるかはわかりますが、配線部分についてはよくわかりません。

4

2 に答える 2

15

ご存知のように、、、などのいくつかの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ページのライフサイクル図

于 2012-04-17T23:51:41.877 に答える
0

私はコントロールタグで私の配線をしています。このようにすると、イベントハンドラーが存在することは明らかです。

<asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" />

コードビハインドでイベントハンドラーを接続する必要がある場合は、プライベート関数呼び出しとしてPage_Loadに配置します。

于 2012-04-17T23:19:05.963 に答える