イベントのバブル
ASP.NET ページ フレームワークは、子コントロールがイベントをそのコンテインメント階層構造で上位に伝達できるようにするイベント バブルと呼ばれる手法を提供します。イベント バブルにより、コントロール階層内のより適切な位置からイベントを発生させることができ、元のコントロールとバブルされたイベントを公開するコントロールの両方にイベント ハンドラをアタッチできます。
イベント バブルは、子コントロール (項目のテンプレート内) が発生させたコマンド イベントを最上位イベントとして公開するために、データ連結コントロール (Repeater、DataList、および DataGrid) によって使用されます。.NET Framework の ASP.NET サーバー コントロールは、コマンド イベント (イベント データ クラスが CommandEventArgs から派生するイベント) に対してイベント バブルを使用しますが、サーバー コントロールに定義されている任意のイベントをバブルできます。
コントロールは、System.Web.UI.Control 基本クラスから継承する 2 つのメソッド OnBubbleEvent および RaiseBubbleEvent を通じてイベント バブルに参加します。これらのメソッドのシグネチャを次のコードに示します。
protected virtual bool OnBubbleEvent(
object source,
EventArgs args
);
protected void RaiseBubbleEvent(
object source,
EventArgs args
);
[Visual Basic]
Overridable Protected Function OnBubbleEvent( _
ByVal source As Object, _
ByVal args As EventArgs _
) As Boolean
Protected Sub RaiseBubbleEvent( _
ByVal source As Object, _
ByVal args As EventArgs _
)
RaiseBubbleEvent の実装は、Control によって提供され、オーバーライドすることはできません。RaiseBubbleEvent は、イベント データを階層構造の上位にあるそのコントロールの親に送信します。バブルされたイベントを処理または発生させるには、コントロールは OnBubbleEvent メソッドをオーバーライドする必要があります。
イベントのバブル先のコントロールの動作は、次の 3 つのいずれかです。
何も実行しません。この場合、イベントは親コントロールに自動的にバブルされます。
特定の処理を実行し、イベントのバブルを続行します。これを実行するには、コントロールは OnBubbleEvent をオーバーライドし、OnBubbleEvent から RaiseBubbleEvent を呼び出す必要があります。イベントの引数の型を確認した後で、イベントをバブルするコード (「template 宣言のあるデータ連結コントロールのサンプル」からの引用) を次に示します。
protected override bool OnBubbleEvent(object source, EventArgs e) { if (e is CommandEventArgs) { // Adds information about an Item to the // CommandEvent. TemplatedListCommandEventArgs args = new TemplatedListCommandEventArgs(this, source, (CommandEventArgs)e); RaiseBubbleEvent(this, args); return true; } return false; } [Visual Basic] Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As Boolean If TypeOf e Is CommandEventArgs Then ' Adds information about an Item to the ' CommandEvent. Dim args As New TemplatedListCommandEventArgs(Me, source, CType(e, CommandEventArgs)) RaiseBubbleEvent(Me, args) Return True End If Return False End Function
イベントのバブルを停止し、イベントを処理するか、または発生させます (またはその両方)。イベントを発生させるには、イベントをリスナにディスパッチするメソッドを呼び出す必要があります。バブルされたイベントを発生させるには、OnBubbleEvent をオーバーライドして、バブルされたイベントを発生させる OnEventName メソッドを呼び出す必要があります。バブルされたイベントを発生させるコントロールは、通常、バブルされたイベントを最上位のイベントとして公開します。バブルされたイベントを発生させるコード (「template 宣言のあるデータ連結コントロールのサンプル」からの引用) を次に示します。
protected override bool OnBubbleEvent(object source, EventArgs e) { bool handled = false; if (e is TemplatedListCommandEventArgs) { TemplatedListCommandEventArgs ce = (TemplatedListCommandEventArgs)e; OnItemCommand(ce); handled = true; } return handled; } [Visual Basic] Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As Boolean Dim handled As Boolean = False If TypeOf e Is TemplatedListCommandEventArgs Then Dim ce As TemplatedListCommandEventArgs = CType(e, TemplatedListCommandEventArgs) OnItemCommand(ce) handled = True End If Return handled End Function
イベント バブルのサンプルについては、「イベント バブル コントロールのサンプル」および「template 宣言のあるデータ連結コントロールのサンプル」を参照してください。
メモ イベント バブルを可能にする OnBubbleEvent メソッドは、イベントを発生させるメソッドの標準 .NET Framework 名前付けパターンに従っていますが、BubbleEvent という名前のイベントは存在しません。バブルされたイベントは、イベント バブルを停止するコントロールの最上位イベントとして公開されます。たとえば、DataList コントロールは、このコントロールのテンプレート内にあるコントロールからの Command イベントを ItemCommand イベントとして公開します。.NET Framework の OnEventName メソッドの標準シグネチャは、1 つの引数
protected void OnEventName (EventArgs e)
を持ちます。ただし、OnBubbleEvent はイベントのソースがコントロールの外部にあるため、2 つの引数を持っています。2 つ目の引数には、ソースを指定します。
このセクションでは、コントロールにバブルされるイベントに対してコントロールがどのように応答するかについて説明しました。バブルされたイベントを定義するコントロールを作成する方法については、次のセクションで説明します。
バブルされたイベントの定義
コントロールでそのコントロールが定義するイベントのイベント バブルを実行できるようにするには、OnEventName メソッドからそのイベントを発生させる ** RaiseBubbleEvent を呼び出す必要があります。コントロール内からは、これ以外の作業を行う必要はありません。バブルを実行できるようにする Command イベントを定義するコントロールのコードを次に示します。
protected virtual void OnCommand(CommandEventArgs e) {
CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];
if (handler != null)
handler(this,e);
// The Command event is bubbled up the control hierarchy.
RaiseBubbleEvent(this, e);
}
[Visual Basic]
Protected Overridable Sub OnCommand(e As CommandEventArgs)
Dim handler As CommandEventHandler = CType(Events(EventCommand), CommandEventHandler)
If Not (handler Is Nothing) Then
handler(Me, e)
End If
' The Command event is bubbled up the control hierarchy.
RaiseBubbleEvent(Me, e)
End Sub
メモ イベント バブルは、コマンド イベントだけに限定されません。ここで説明する機構を使用すると、任意のイベントをバブルできます。