次の方法で共有


方法 : クラスにイベントを実装する

更新 : 2007 年 11 月

以下の手順では、クラスにイベントを実装する方法について説明します。最初の手順では、関連付けられたデータを持たないイベントを実装します。このイベントは、イベント データとして System.EventArgs クラスを使用し、デリゲート ハンドラとして System.EventHandler クラスを使用します。2 番目の手順では、カスタム データを持つイベントを実装します。このイベントは、イベント データおよびイベント ハンドラのカスタム クラスを定義します。

イベントの発生と処理を説明する詳細なサンプルについては、「方法 : イベントを発生させる/処理する」を参照してください。

イベント固有のデータを持たないイベントを実装するには

  1. クラスにパブリック イベント メンバを定義します。イベント メンバの型に System.EventHandler デリゲートを設定します。

    public class Countdown 
    {
        ...
        public event EventHandler CountdownCompleted;   
    }
    
    Public Class Countdown
        ...
        Public Event CountdownCompleted As EventHandler
    End Class
    
  2. イベントを発生させるクラスにプロテクト メソッドを提供します。メソッドに OnEventName という名前を付けます。このメソッド内で対象のイベントを発生させます。

    public class Countdown 
    {
        ...
        public event EventHandler CountdownCompleted;   
        protected virtual void OnCountdownCompleted(EventArgs e)    {        if (CountdownCompleted != null)            CountdownCompleted(this, e);    }
    }
    
    Public Class Countdown
       ...
       Public Event CountdownCompleted As EventHandler
       Protected Overridable Sub OnCountdownCompleted(e As EventArgs)      RaiseEvent CountdownCompleted(Me, e)   End Sub
    End Class
    
  3. クラスでいつイベントを発生させるかを決定します。OnEventName を呼び出して、イベントを発生させます。

    public class Countdown 
    {
        ...
        public void Decrement
        {
            internalCounter = internalCounter - 1;
            if (internalCounter == 0)
                OnCountdownCompleted(new EventArgs());
        }
    }
    
    Public Class Countdown
        ...
        Public Function Decrement
            InternalCounter = internalCounter - 1
            If internalCounter = 0
                OnCountdownComplete(New EventArgs())
            End If
        End Function
    End Class
    

イベント固有のデータを持つイベントを実装するには

  1. イベントのデータを提供するクラスを定義します。クラスに EventNameArgs という名前を付け、System.EventArgs からこのクラスを派生させ、イベント固有のメンバを追加します。

    public class AlarmEventArgs : EventArgs 
    {
       private readonly int nrings = 0;
       private readonly bool snoozePressed = false;
    
       //Constructor.
       public AlarmEventArgs(bool snoozePressed, int nrings) 
       {
          this.snoozePressed = snoozePressed;
          this.nrings = nrings;
       }
    
       //Properties.
       public string AlarmText {  
          ...
       }
       public int NumRings {
          ...
       }
       public bool SnoozePressed{
          ...
       }
    }
    
    Public Class AlarmEventArgs
       Inherits EventArgs
       Private nrings As Integer = 0
       Private _snoozePressed As Boolean = False
    
       'Constructor.
       Public Sub New(ByVal snoozePressed As Boolean, ByVal nrings As Integer) 
          Me.snoozePressed = snoozePressed
          Me.nrings = nrings
       End Sub
    
       'Properties.
       Public ReadOnly Property AlarmText() As String
          ...
       End Property 
    
       Public ReadOnly Property NumRings() As Integer
          ...
       End Property 
    
       Public ReadOnly Property SnoozePressed() As Boolean
          ...
       End Property
    End Class
    
  2. イベントのデリゲートを宣言します。デリゲートに EventNameEventHandler という名前を付けます。

    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
    Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
    
  3. クラスに EventName という名前のパブリック イベント メンバを定義します。イベント メンバの型にイベント デリゲート型を設定します。

    public class AlarmClock 
    {
        ...
        public event AlarmEventHandler Alarm;
    }
    
    Public Class AlarmClock
        ...
        Public Event Alarm As AlarmEventHandler
    End Class
    
  4. イベントを発生させるクラスにプロテクト メソッドを定義します。メソッドに OnEventName という名前を付けます。このメソッド内で対象のイベントを発生させます。

    public class AlarmClock 
    {
        ...
        public event AlarmHandler Alarm;
        protected virtual void OnAlarm(AlarmEventArgs e)    {      if (Alarm != null)           Alarm(this, e);     }
    }
    
    Public Class AlarmClock
        ...
        Public Event Alarm As AlarmEventHandler
        Protected Overridable Sub OnAlarm(e As AlarmEventArgs)        RaiseEvent Alarm(Me, e)    End Sub
    End Class
    
  5. クラスでいつイベントを発生させるかを決定します。OnEventName を呼び出してイベントを発生させ、EventNameEventArgs を使用してイベント固有のデータを渡します。

    Public Class AlarmClock
    {
        ...
        public void Start()
        {
            ...
            System.Threading.Thread.Sleep(300);
            AlarmEventArgs e = new AlarmEventArgs(false, 0);
            OnAlarm(e);
        }
    }
    
    Public Class AlarmClock
        ...
        Public Function Start
            ...
            System.Threading.Thread.Sleep(300)
            Dim e As AlarmEventArgs = New AlarmEventArgs(False, 0)
            OnAlarm(e)
        End Function
    End Class
    

参照

処理手順

方法 : イベントを発生させる/処理する

概念

イベントとデリゲート

イベントの発生

その他の技術情報

イベントの処理と発生