イベントの定義
イベントのためのデリゲート モデルの詳細については、「クラスへのイベントの追加」を参照してください。
イベント機能は、次の要素によって提供されます。
イベント データを保持するクラス (たとえば、EventArgs、ImageClickEventArgs)。
イベント デリゲート (たとえば、EventHandler、ImageClickEventHandler)。
メモ 上の 2 つのクラスは、一般にコントロールの外部で定義されます。下の 2 つのメンバは、コントロール内で定義されます。
コントロール内に定義されたイベント メンバ。このようなイベント メンバは、event キーワードによって識別されます。
デリゲートを呼び出すコントロール内のメソッド (たとえば、OnClick、OnTextChanged)。
カスタム コントロール MyButton
に Click
イベントを定義するサンプルを次に示します。
// If the event does not generate data, you do not have
// to define a class for the event data or define an event delegate.
// Use System.EventArgs for event data
// and System.EventHandler as the event delegate.
// MyButton uses EventHandler and EventArgs.
using System;
using System.Web.UI;
namespace CustomControls
{
public class MyButton: Control, IPostBackEventHandler
{
// Defines the Click event.
public event EventHandler Click;
// OnClick dispatches the event to delegates that
// are registered with the Click event.
// Controls that derive from MyButton can handle the
// Click event by overriding OnClick
// instead of attaching a delegate. The event data
// is passed as an argument to this method.
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
{
Click(this, e);
}
}
// Method of IPostBackEventHandler that raises change events.
public void RaisePostBackEvent(string eventArgument)
{
OnClick(EventArgs.Empty);
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE = submit name = " + this.UniqueID +
" Value = 'Click Me' />");
}
}
}
[Visual Basic]
' If the event does not generate data, you do not have
' to define a class for the event data or define an event delegate.
' Use System.EventArgs for event data
' and System.EventHandler as the event delegate.
' MyButton uses EventHandler and EventArgs.
Option Explicit
Option Strict
Imports System
Imports System.Web.UI
Namespace CustomControls
Public Class MyButton
Inherits Control
Implements IPostBackEventHandler
' Defines the Click event.
Public Event Click As EventHandler
' OnClick dispatches the event to delegates that
' are registered with the Click event.
' Controls that derive from MyButton can handle the
' Click event by overriding OnClick
' instead of attaching a delegate. The event data
' is passed as an argument to this method.
Protected Overridable Sub OnClick(e As EventArgs)
RaiseEvent Click(Me, e)
End Sub
' Method of IPostBackEventHandler that raises change events.
Public Sub RaisePostBackEvent(eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
OnClick(EventArgs.Empty)
End Sub 'RaisePostBackEvent
Protected Overrides Sub Render(output As HtmlTextWriter)
output.Write(("<INPUT TYPE = submit name = " & Me.UniqueID & " Value = 'Click Me' />"))
End Sub
End Class
End Namespace
コントロールの開発者は、イベントを定義するだけでなく、イベントを発生させる方法 (どこから OnEventName メソッドを呼び出すか) を決定する必要があります。たとえば、MyButton
は、その RaisePostBackEvent メソッド (IPostBackEventHandler コントラクトの一部) から Click
イベントを発生させます。このサンプルの詳細については、「ポストバック イベントのキャプチャ」を参照してください。
イベント実装の最適化
上で説明したイベント実装では、パフォーマンスの最適化は行われていません。デリゲート インスタンスごとに 1 つのフィールドが生成されるため、コントロールで多数のイベントを定義すると、ストレージ コストが大きくなります。System.Web.UI.Control 基本クラスは、その Events プロパティを使用して、イベント デリゲートの格納と取得のためのより効率的なデータ構造体を提供します。Events プロパティは、イベント デリゲートを効率的に格納および取得できるようにデザインされた EventHandlerList 型の構造体です。Events プロパティを使用したイベントの実装のサンプルを次に示します。この C# のサンプルは、このトピックで既に定義した MyButton
のサンプルとは、Click
イベントを実装する点だけが異なります。このイベントを実装するコードは、太字フォントで強調して示します。
メモ イベント プロパティは、このリリースの Visual Basic .NET ではサポートされていません。
using System;
using System.Web.UI;
namespace CustomControls
{
public class OptimizedEventButton: Control, IPostBackEventHandler
{
// Defines a key for storing the delegate for the Click event
// in the Events list.
private static readonly object ClickEvent = new object();
// Defines the Click event using the event property syntax.
// The Events property stores all the event delegates of
// a control as name/value pairs.
public event EventHandler Click
{
// When a user attaches an event handler to the Click event
// (Click += myHandler;), the Add method
// adds the handler to the
// delegate for the Click event (keyed by ClickEvent
// in the Events list).
add { Events.AddHandler(ClickEvent, value); }
// When a user removes an event handler from the Click event
// (Click -= myHandler;), the Remove method
// removes the handler from the
// delegate for the Click event (keyed by ClickEvent
// in the Events list).
remove { Events.RemoveHandler(ClickEvent, value); }
}
// Invokes delegates registered with the Click event.
//
protected virtual void OnClick(EventArgs e)
{
// Retrieves the event delegate for the Click event
// from the Events property (which stores
// the control's event delegates). You must
// cast the retrieved delegate to the type of your
// event delegate.
EventHandler clickEventDelegate = (EventHandler)Events[ClickEvent]; if (clickEventDelegate != null) { clickEventDelegate(this, e); }
}
// Method of IPostBackEventHandler that raises change events.
//
public void RaisePostBackEvent(string eventArgument)
{
OnClick(new EventArgs());
}
protected override void Render(HtmlTextWriter output)
{
output.Write("<INPUT TYPE = submit name = " + this.UniqueID +
" Value = 'Click Me' />");
}
}
}
メモ わかりやすくするために、このドキュメントの他のサンプルでは、イベント フィールドを使用してイベントを定義しています。しかし、実際のコントロール内では、ここで説明した最適化された実装を使用してください。
参照
イベントの処理と発生 | イベントのバブル | ポストバック データの処理 | ポストバック イベントのキャプチャ | ポストバックのためのクライアント側スクリプトの生成