Оператор 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
Части
Компонент |
Описание |
attrlist |
Необязательный. Список атрибутов, которые применяются для данного события. Несколько атрибутов разделяются запятыми. Необходимо заключить Список атрибутов (Visual Basic) в угловые скобки ("<" и ">"). |
accessmodifier |
Необязательный. Указывает, что код может иметь доступ к событию. Может принимать следующие значения:
Можно указать Protected Friend, чтобы разрешить доступ из кода класса события, производного класса или той же сборки. |
Shared |
Необязательный. Указывает, что это событие не связано ни с каким конкретным экземпляром класса или структуры. |
Shadows |
Необязательный. Указывает, что данное событие повторно объявляет и скрывает идентично именованный программный элемент, или набор перегружаемых элементов, в базовом классе. Можно скрыть любой тип объявленного элемента с помощью любого другого типа. Скрытый элемент недоступен из производного класса, в котором он скрыт, за исключением местоположений, где он является недоступным. Например, если элемент Private скрывает элемент базового класса, код, который не имеет разрешения на доступ к элементу Private, обращается к элементу базового класса. |
eventname |
Обязательный. Имя события, удовлетворяющее обычным правилам именования переменных. |
parameterlist |
Необязательный. Список локальных переменных, предоставляющих параметры данного события. Необходимо заключить Список параметров (Visual Basic) в круглые скобки. |
Implements |
Необязательный. Указывает на то, что это событие реализует событие интерфейса. |
implementslist |
Параметр обязателен, если указано ключевое слово Implements. Список реализуемых процедур Sub. Несколько процедур разделяются запятыми: реализуемая_процедура [ , реализуемая_процедура ... ] Каждая процедура 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. Необходимо заключить Список параметров (Visual Basic) в круглые скобки. |
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 только на уровне модуля. Это означает, что контекст объявления для события должен быть классом, структурой, модулем или интерфейсом, и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию (Visual Basic).
В большинстве случаев для объявления события можно использовать первый предложенный в разделе "Синтаксис" этой темы синтаксис. Однако некоторые сценарии требуют наличия большего контроля над поведением события. Последний предложенный синтаксис в разделе "Синтаксис" этой темы, который использует ключевое слово Custom, обеспечивает этот контроль, позволяя определять пользовательские события. В пользовательском событии указывается, что конкретно происходит, когда в коде добавляется или удаляется обработчик событий или когда код вызывает событие. Примеры см. в разделах Практическое руководство. Объявление пользовательских событий для экономии памяти (Visual Basic) и Практическое руководство. Объявление пользовательских событий для предотвращения блокировки (Visual Basic).
Пример
В следующем примере используются события для отсчета от 10 до 0 секунд. В коде показаны некоторые связанные с событиями методы, свойства и операторы. Включая инструкцию RaiseEvent.
Класс, инициирующий событие, является источником события, а методы, обрабатывающие событие, — его обработчиками. Источник события может иметь несколько обработчиков для создаваемых событий. Когда класс создает событие, это событие возникает во всех классах, выбранных для обработки событий данного экземпляра объекта.
В примере также используется форма (Form1) с кнопкой (Button1) и текстовое поле (TextBox1). По щелчку кнопки, первое текстовое поле отображает отсчет от 10 до 0 секунд. По истечении всего времени (10 секунд), первое текстовом поле отображает "Готово".
Код для 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 секунд), первое текстовом поле отображает "Готово".
Примечание
Метод My.Application.DoEvents обрабатывает события не так, как форма.Чтобы разрешить форме непосредственно обрабатывать события, можно использовать многопоточность.Дополнительные сведения см. в разделе Работа с потоками (C# и Visual Basic).
См. также
Задачи
Практическое руководство. Объявление пользовательских событий для экономии памяти (Visual Basic)
Ссылки
Предложение Handles (Visual Basic)