Практическое руководство. Реализация событий в классе
Обновлен: Ноябрь 2007
Следующие процедуры описывают реализацию событий в классе. Первая процедура реализует событие, которое не имеет связанных данных; она использует классы System.EventArgs и System.EventHandler для данных события и обработчика делегата события. Вторая процедура реализует событие с пользовательскими данными; она определяет пользовательские классы для данных события и обработчика делегата события.
Полный пример, иллюстрирующий инициацию и обработку событий, см. в разделе Практическое руководство. Создание и прием событий
Реализация событий без специальных данных
Определите общий элемент события в классе. Задайте тип элемента события делегату System.EventHandler.
public class Countdown { ... public event EventHandler CountdownCompleted; }
Public Class Countdown ... Public Event CountdownCompleted As EventHandler End Class
Предоставьте защищенный метод в своем классе, который инициирует событие. Задайте методу имя 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
Определите, когда нужно создавать событие в классе. Вызовите 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
Реализация события со специальными данными
Определите класс, который предоставляет данные для события. Задайте классу имя 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
Объявите делегата для события. Задайте делегату имя EventNameEventHandler.
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
Определите общий элемент события с именем EventName в классе. Задайте тип элемента события как тип делегата событий.
public class AlarmClock { ... public event AlarmEventHandler Alarm; }
Public Class AlarmClock ... Public Event Alarm As AlarmEventHandler End Class
Определите защищенный метод в своем классе, который создает событие. Задайте методу имя 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
Определите, когда нужно создавать событие в классе. Вызовите OnEventName для создания события и передайте характерные для события данные с помощью EventName EventArgs.
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
См. также
Задачи
Практическое руководство. Вызов и прием событий