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


Оператор события

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

Синтаксис

[ <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 Необязательно. Список атрибутов, применяемых к этому событию. Несколько атрибутов разделены запятыми. Необходимо заключить список атрибутов в угловые скобки ("<" и ">").
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и RemoveHandlerRaiseEvent методы.
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 аргументы. События не имеют возвращаемых значений.

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

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

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

Пример

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

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

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

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

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

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 не обрабатывает события таким же образом, как и форма. Чтобы форма обрабатывала события напрямую, можно использовать многопоточность. Для получения дополнительной информации см. Управляемая многозадачность.

См. также