Gewusst wie: Implementieren von Ereignissen in der Klasse

Aktualisiert: November 2007

Die folgenden Verfahren beschreiben, wie ein Ereignis in einer Klasse implementiert wird. Das erste Verfahren implementiert ein Ereignis, das über keine zugeordneten Daten verfügt. Es verwendet die System.EventArgs-Klasse und die System.EventHandler-Klasse für die Ereignisdaten und den Delegathandler. Das zweite Verfahren implementiert ein Ereignis mit benutzerdefinierten Daten und definiert benutzerdefinierte Klassen für die Ereignisdaten und den Ereignisdelegathandler.

Ein vollständiges Beispiel, das die Auslösung und Behandlung von Ereignissen illustriert, finden Sie unter Gewusst wie: Auslösen und Behandeln von Ereignissen.

So implementieren Sie ein Ereignis ohne ereignisspezifische Daten

  1. Definieren Sie in der Klasse einen öffentlichen Ereignismember. Legen Sie den Typ des Ereignismembers auf einen System.EventHandler-Delegat fest.

    public class Countdown 
    {
        ...
        public event EventHandler CountdownCompleted;   
    }
    
    Public Class Countdown
        ...
        Public Event CountdownCompleted As EventHandler
    End Class
    
  2. Stellen Sie eine geschützte Methode in der Klasse bereit, die das Ereignis auslöst. Nennen Sie die Methode OnEventName. Lösen Sie das Ereignis innerhalb der Methode aus.

    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. Bestimmen Sie, wann das Ereignis in der Klasse ausgelöst werden soll. Rufen Sie OnEventName auf, um das Ereignis auszulösen.

    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
    

So implementieren Sie ein Ereignis mit ereignisspezifischen Daten

  1. Definieren Sie eine Klasse, die Daten für das Ereignis bereitstellt. Nennen Sie die Klasse EventNameArgs, leiten Sie die Klasse von System.EventArgs ab, und fügen Sie alle ereignisspezifischen Member hinzu.

    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. Deklarieren Sie einen Delegat für das Ereignis. Nennen Sie den Delegat EventNameEventHandler.

    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
    Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
    
  3. Definieren Sie in der Klasse einen öffentlichen Ereignismember mit dem Namen EventName. Legen Sie den Typ des Ereignismembers auf den Ereignisdelegattyp fest.

    public class AlarmClock 
    {
        ...
        public event AlarmEventHandler Alarm;
    }
    
    Public Class AlarmClock
        ...
        Public Event Alarm As AlarmEventHandler
    End Class
    
  4. Definieren Sie eine geschützte Methode in der Klasse, die das Ereignis auslöst. Nennen Sie die Methode OnEventName. Lösen Sie das Ereignis innerhalb der Methode aus.

    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. Bestimmen Sie, wann das Ereignis in der Klasse ausgelöst werden soll. Rufen Sie OnEventName auf, um das Ereignis auszulösen, und übergeben Sie die ereignisspezifischen Daten mit 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
    

Siehe auch

Aufgaben

Gewusst wie: Auslösen und Behandeln von Ereignissen

Konzepte

Ereignisse und Delegaten

Auslösen eines Ereignisses

Weitere Ressourcen

Behandeln und Auslösen von Ereignissen