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


Оператор Event

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

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

[ <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

Необязательно. Указывает, что код может иметь доступ к событию. Может быть одно из следующих:

  • Public — любой код, который имеет доступ к элементу, который объявляет, что может получить доступ к нему.

  • Protected — только код в пределах класса или производный класс может иметь доступ к нему.

  • Friend — только код в пределах одной и той же сборки имеет доступ к нему.

  • Private — только код внутри элемента, объявляющего событие, имеет к нему доступ.

Можно указать Protected Friend, чтобы разрешить доступ из кода класса события, производного класса или той же сборки.

Shared

Необязательно. Указывает, что это событие не связано ни с каким конкретным экземпляром класса или структуры.

Shadows

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

Скрытый элемент недоступен из производного класса, в котором он скрыт, за исключением местоположений, где он является недоступным. Например, если элемент Private скрывает элемент базового класса, код, который не имеет разрешения на доступ к элементу Private, обращается к элементу базового класса.

eventname

Обязательно. Имя события, удовлетворяющее обычным правилам именования переменных.

parameterlist

Необязательно. Список локальных переменных, предоставляющих параметры данного события. Необходимо заключить Список параметров в круглые скобки.

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. Необходимо заключить Список параметров в круглые скобки.

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
6hwhs172.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

Пример

В следующем примере используются события для обратного счета от 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(ByVal sender As Object, _
                       ByVal e As System.EventArgs) _
                       Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          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 секунд), первое текстовом поле отображает "Готово".

6hwhs172.alert_note(ru-ru,VS.90).gifПримечание.

Метод My.Application.DoEvents обрабатывает события не так, как форма. Чтобы разрешить форме непосредственно обрабатывать события, можно использовать многопоточность. Дополнительные сведения см. в разделе Многопотоковость в Visual Basic.

См. также

Задачи

Практическое руководство. Добавление событий в класс

Практическое руководство. Объявление событий, которые экономят использование памяти

Практическое руководство. Объявление события, исключающего блокирование

Ссылки

Оператор RaiseEvent

Оператор Implements

Оператор AddHandler

Оператор RemoveHandler

Handles

Оператор Delegate

Shared (Visual Basic)

Shadows

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

События в Visual Basic