次の方法で共有


イベントの定義

イベントのためのデリゲート モデルの詳細については、「クラスへのイベントの追加」を参照してください。

イベント機能は、次の要素によって提供されます。

  • イベント データを保持するクラス (たとえば、EventArgsImageClickEventArgs)。

  • イベント デリゲート (たとえば、EventHandlerImageClickEventHandler)。

    メモ   上の 2 つのクラスは、一般にコントロールの外部で定義されます。下の 2 つのメンバは、コントロール内で定義されます。

  • コントロール内に定義されたイベント メンバ。このようなイベント メンバは、event キーワードによって識別されます。

  • デリゲートを呼び出すコントロール内のメソッド (たとえば、OnClickOnTextChanged)。

カスタム コントロール MyButtonClick イベントを定義するサンプルを次に示します。

// 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' />"); 
      }
   }    
}

メモ   わかりやすくするために、このドキュメントの他のサンプルでは、イベント フィールドを使用してイベントを定義しています。しかし、実際のコントロール内では、ここで説明した最適化された実装を使用してください。

参照

イベントの処理と発生 | イベントのバブル | ポストバック データの処理 | ポストバック イベントのキャプチャ | ポストバックのためのクライアント側スクリプトの生成