Оператор Event

Объявляет пользовательское событие.

Синтаксис

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

Детали

Часть Description
attrlist Необязательно. Список атрибутов, применимых к этому событию. Несколько атрибутов разделяются запятыми. Необходимо заключить список атрибутов в угловые скобки ("<" и ">").
accessmodifier Необязательно. Указывает, какой код может получать доступ к событию. Может применяться один из перечисленных ниже типов.

- Общедоступный — любой код, который может получить доступ к элементу, который объявляет, что он может получить к нему доступ.
- Защищенный — только код в своем классе или производный класс может получить к нему доступ.
- Друг— доступ к нему может получить только код в той же сборке.
- Закрытый — только код в элементе, который объявляет, что он может получить к нему доступ.
- Защищенный код только для друга в классе события, производном классе или той же сборке может получить к нему доступ.
- Закрытый защищенный код в классе события или производном классе в той же сборке может получить к нему доступ.
Shared Необязательно. Указывает, что это событие не связано с определенным экземпляром класса или структуры.
Shadows Необязательно. Указывает, что это событие повторно объявляет и скрывает программные элементы с одинаковыми именами или набор перегруженных элементов в базовом классе. Можно скрыть любой тип объявленного элемента, используя любой другой тип.

Скрытый элемент недоступен из производного класса, который его скрывает, за исключением тех классов, из которых недоступен скрывающий элемент. Например, если элемент Private скрывает элемент базового класса, то код, у которого нет разрешений на доступ к элементу Private, получает доступ к элементу базового класса.
eventname Обязательный. Имя события; соответствует стандартным правилам именования переменных.
parameterlist Необязательно. Список локальных переменных, которые представляют параметры этого события. Необходимо заключить список параметров в скобки.
Implements Необязательно. Указывает, что это событие реализует событие интерфейса.
implementslist Является обязательным, если предоставлен параметр Implements. Список реализуемых процедур Sub. Несколько процедур разделяются запятыми.

implementedprocedure [ , implementedprocedure ... ]

Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.

interface.definedname

- interface — обязательный. Имя интерфейса, реализуемого классом или структурой, содержащими эту процедуру.
- Definedname — обязательный. Имя, под которым процедура определена в interface. Оно не должно совпадать с name, именем, которое эта процедура использует для реализации определенной процедуры.
Custom Обязательный. События, объявленные как Custom, должны определять настраиваемые методы доступа AddHandler, RemoveHandler и RaiseEvent.
delegatename Необязательно. Имя делегата, указывающего подпись обработчика событий.
AddHandler Обязательный. Объявляет метод доступа AddHandler, который задает операторы, выполняемые при добавлении обработчика событий, явно с помощью оператора AddHandler или неявно с помощью предложения Handles.
End AddHandler Обязательный. Завершает блок AddHandler.
value Обязательный. Имя параметра.
RemoveHandler Обязательный. Объявляет метод доступа RemoveHandler, который задает операторы, выполняемые при удалении обработчика событий с помощью оператора RemoveHandler.
End RemoveHandler Обязательный. Завершает блок RemoveHandler.
RaiseEvent Обязательный. Объявляет метод доступа RaiseEvent, который задает операторы, выполняемые при создании события с помощью оператора RaiseEvent. Как правило, при этом вызывается список делегатов, обслуживаемых методами доступа AddHandler и RemoveHandler.
End RaiseEvent Обязательный. Завершает блок RaiseEvent.
delegatesignature Обязательный. Список параметров, соответствующий параметрам, требуемым делегатом delegatename. Необходимо заключить список параметров в скобки.
statements Необязательно. Операторы, содержащие тела методов AddHandler, RemoveHandler и RaiseEvent.
End Event Обязательный. Завершает блок Event.

Замечания

После объявления события используйте оператор RaiseEvent для создания события. Типичные события можно объявлять и создавать, как показано в следующих фрагментах кода.

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Примечание.

Аргументы событий можно объявлять так же, как аргументы процедур, за следующими исключениями: события не могут иметь именованные аргументы, аргументы ParamArray и аргументы Optional. События не имеют возвращаемых значений.

Для обработки события его необходимо связать с подпрограммой обработчика событий с помощью оператора Handles или AddHandler. Подписи подпрограммы и события должны совпадать. Для обработки общего события необходимо использовать оператор AddHandler.

Event можно использовать только на уровне модуля. Это означает, что контекст объявления для события должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.

В большинстве случаев для объявления события можно использовать первый пример синтаксиса в разделе "Синтаксис" этой статьи. Однако в некоторых сценариях требуется контролировать поведение события более детально. Последний пример синтаксиса в разделе "Синтаксис" этой статьи, в котором используется ключевое слово Custom, обеспечивает такие возможности, позволяя определять настраиваемые события. В настраиваемом событии можно точно указать, что происходит, когда код добавляет или удаляет обработчик события для события или когда код вызывает событие. Примеры см. в статье "Практическое руководство. Объявление настраиваемых событий для экономии памяти и практическое руководство. Объявление настраиваемых событий для предотвращения блокировки".

Пример

В следующем примере события используются для выполнения обратного отсчета от 10 до 0 секунд. Код иллюстрирует различные связанные с событиями методы, свойства и операторы. В том числе оператор RaiseEvent.

Класс, который вызывает событие, является источником события, а методы, обрабатывающие события, — обработчиками событий. Источник события может иметь несколько обработчиков для создаваемых им событий. Когда класс создает событие, это событие создается во всех классах, выбранных для обработки событий данного экземпляра объекта.

В примере также используется форма (Form1) с кнопкой (Button1) и текстовым полем (TextBox1). При нажатии кнопки в первом текстовом поле отображается обратный отсчет от 10 до 0 секунд. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.

Код для Form1 указывает начальное и конечное состояния формы. Он также содержит код, выполняемый при создании событий.

Чтобы использовать этот пример, откройте новый проект Windows Forms. Затем добавьте кнопку с именем Button1 и текстовое поле с именем TextBox1 в главную форму с именем Form1. Затем щелкните форму правой кнопкой мыши и щелкните "Просмотреть код ", чтобы открыть редактор кода.

Добавьте переменную WithEvents в раздел объявлений класса Form1:

Private WithEvents mText As TimerState

Добавьте следующий код в код для Form1. Замените все повторяющиеся процедуры, которые могут существовать, такие как Form_Load или Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Нажмите клавишу F5, чтобы запустить предыдущий пример, и нажмите кнопку "Пуск". Первое текстовое поле начинает обратный отсчет. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.

Примечание.

Способ обработки событий методом My.Application.DoEvents отличается от обработки событий формой. Чтобы разрешить форме обрабатывать события напрямую, можно использовать многопоточность. Дополнительные сведения см. в разделе "Управляемый поток".

См. также