Поделиться через


Практическое руководство. Реализация событий в классе

Обновлен: Ноябрь 2007

Следующие процедуры описывают реализацию событий в классе. Первая процедура реализует событие, которое не имеет связанных данных; она использует классы System.EventArgs и System.EventHandler для данных события и обработчика делегата события. Вторая процедура реализует событие с пользовательскими данными; она определяет пользовательские классы для данных события и обработчика делегата события.

Полный пример, иллюстрирующий инициацию и обработку событий, см. в разделе Практическое руководство. Создание и прием событий

Реализация событий без специальных данных

  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 для создания события и передайте характерные для события данные с помощью 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
    

См. также

Задачи

Практическое руководство. Вызов и прием событий

Основные понятия

События и делегаты

Вызов события

Другие ресурсы

Обработка и вызов событий