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
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
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
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
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
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)
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
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
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