Оператор EventEvent Statement

Объявляет пользовательское событие.Declares a user-defined event.

СинтаксисSyntax

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

ЧастиParts

ОтделениеPart ОписаниеDescription
attrlist Необязательный параметр.Optional. Список атрибутов, применимых к этому событию.List of attributes that apply to this event. Несколько атрибутов разделяются запятыми.Multiple attributes are separated by commas. Необходимо заключить список атрибутов в угловые скобки (»<«и»>«).You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier Необязательный параметр.Optional. Указывает, какой код может получать доступ к событию.Specifies what code can access the event. Ниже указаны доступные значения.Can be one of the following:

- Открытый— любой код, который можно получить доступ к элементу, который объявляет он доступен.- Public—any code that can access the element that declares it can access it.
- Защищенные— только код внутри его класса или производного класса можно получить доступ к его.- Protected—only code within its class or a derived class can access it.
- Дружественные— только код в той же сборке может получить доступ к его.- Friend—only code in the same assembly can access it.
- Закрытый— доступ к нему только код в объявляющем его элементе.- Private—only code in the element that declares it can access it.
- Protected Friend-только доступ к нему код в классе события, производном классе или той же сборки.- Protected Friend-only code in the event's class, a derived class, or the same assembly can access it.
- Частный защищенный-только доступ к нему код в классе события или производного класса в той же сборке.- Private Protected-only code in the event's class or a derived class in the same assembly can access it.
Shared Необязательный параметр.Optional. Указывает, что это событие не связано с определенным экземпляром класса или структуры.Specifies that this event is not associated with a specific instance of a class or structure.
Shadows Необязательный параметр.Optional. Указывает, что это событие повторно объявляет и скрывает программные элементы с одинаковыми именами или набор перегруженных элементов в базовом классе.Indicates that this event redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. Можно скрыть любой тип объявленного элемента, используя любой другой тип.You can shadow any kind of declared element with any other kind.

Скрытый элемент недоступен из производного класса, который его скрывает, за исключением тех классов, из которых недоступен скрывающий элемент.A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. Например, если элемент Private скрывает элемент базового класса, то код, у которого нет разрешений на доступ к элементу Private, получает доступ к элементу базового класса.For example, if a Private element shadows a base-class element, code that does not have permission to access the Private element accesses the base-class element instead.
eventname Обязательный.Required. Имя события; соответствует стандартным правилам именования переменных.Name of the event; follows standard variable naming conventions.
parameterlist Необязательный параметр.Optional. Список локальных переменных, которые представляют параметры этого события.List of local variables that represent the parameters of this event. Необходимо заключить список параметров в круглые скобки.You must enclose the Parameter List in parentheses.
Implements Необязательный параметр.Optional. Указывает, что это событие реализует событие интерфейса.Indicates that this event implements an event of an interface.
implementslist Является обязательным, если предоставлен параметр Implements.Required if Implements is supplied. Список реализуемых процедур Sub.List of Sub procedures being implemented. Несколько процедур разделяются запятыми.Multiple procedures are separated by commas:

реализуемая_процедура [, реализуемая_процедура ...]implementedprocedure [ , implementedprocedure ... ]

Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.Each implementedprocedure has the following syntax and parts:

interface.definednameinterface.definedname

- interface -Required.- interface - Required. Имя интерфейса, реализуемого классом или структурой, содержащими эту процедуру.Name of an interface that this procedure's containing class or structure is implementing.
- Definedname -Required.- Definedname - Required. Имя, под которым процедура определена в interface.Name by which the procedure is defined in interface. Оно не должно совпадать с name, именем, которое эта процедура использует для реализации определенной процедуры.This does not have to be the same as name, the name that this procedure is using to implement the defined procedure.
Custom Обязательный.Required. События, объявленные как Custom, должны определять настраиваемые методы доступа AddHandler, RemoveHandler и RaiseEvent.Events declared as Custom must define custom AddHandler, RemoveHandler, and RaiseEvent accessors.
delegatename Необязательный параметр.Optional. Имя делегата, указывающего подпись обработчика событий.The name of a delegate that specifies the event-handler signature.
AddHandler Обязательный.Required. Объявляет метод доступа AddHandler, который задает операторы, выполняемые при добавлении обработчика событий, явно с помощью оператора AddHandler или неявно с помощью предложения Handles.Declares an AddHandler accessor, which specifies the statements to execute when an event handler is added, either explicitly by using the AddHandler statement or implicitly by using the Handles clause.
End AddHandler Обязательный.Required. Завершает блок AddHandler.Terminates the AddHandler block.
value Обязательный.Required. Имя параметра.Parameter name.
RemoveHandler Обязательный.Required. Объявляет метод доступа RemoveHandler, который задает операторы, выполняемые при удалении обработчика событий с помощью оператора RemoveHandler.Declares a RemoveHandler accessor, which specifies the statements to execute when an event handler is removed using the RemoveHandler statement.
End RemoveHandler Обязательный.Required. Завершает блок RemoveHandler.Terminates the RemoveHandler block.
RaiseEvent Обязательный.Required. Объявляет метод доступа RaiseEvent, который задает операторы, выполняемые при создании события с помощью оператора RaiseEvent.Declares a RaiseEvent accessor, which specifies the statements to execute when the event is raised using the RaiseEvent statement. Как правило, при этом вызывается список делегатов, обслуживаемых методами доступа AddHandler и RemoveHandler.Typically, this invokes a list of delegates maintained by the AddHandler and RemoveHandler accessors.
End RaiseEvent Обязательный.Required. Завершает блок RaiseEvent.Terminates the RaiseEvent block.
delegatesignature Обязательный.Required. Список параметров, соответствующий параметрам, требуемым делегатом delegatename.List of parameters that matches the parameters required by the delegatename delegate. Необходимо заключить список параметров в круглые скобки.You must enclose the Parameter List in parentheses.
statements Необязательный параметр.Optional. Операторы, содержащие тела методов AddHandler, RemoveHandler и RaiseEvent.Statements that contain the bodies of the AddHandler, RemoveHandler, and RaiseEvent methods.
End Event Обязательный.Required. Завершает блок Event.Terminates the Event block.

ПримечанияRemarks

После объявления события используйте оператор RaiseEvent для создания события.Once the event has been declared, use the RaiseEvent statement to raise the event. Типичные события можно объявлять и создавать, как показано в следующих фрагментах кода.A typical event might be declared and raised as shown in the following fragments:

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.You can declare event arguments just as you do arguments of procedures, with the following exceptions: events cannot have named arguments, ParamArray arguments, or Optional arguments. События не имеют возвращаемых значений.Events do not have return values.

Для обработки события его необходимо связать с подпрограммой обработчика событий с помощью оператора Handles или AddHandler.To handle an event, you must associate it with an event handler subroutine using either the Handles or AddHandler statement. Подписи подпрограммы и события должны совпадать.The signatures of the subroutine and the event must match. Для обработки общего события необходимо использовать оператор AddHandler.To handle a shared event, you must use the AddHandler statement.

Event можно использовать только на уровне модуля.You can use Event only at module level. Это означает, что контекст объявления события должен быть класс, структура, модуль или интерфейс, и не может быть исходный файл, пространство имен, процедуры или блока.This means the declaration context for an event must be a class, structure, module, or interface, and cannot be a source file, namespace, procedure, or block. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.For more information, see Declaration Contexts and Default Access Levels.

В большинстве случаев для объявления события можно использовать первый пример синтаксиса в разделе "Синтаксис" этой статьи.In most circumstances, you can use the first syntax in the Syntax section of this topic for declaring events. Однако в некоторых сценариях требуется контролировать поведение события более детально.However, some scenarios require that you have more control over the detailed behavior of the event. Последний пример синтаксиса в разделе "Синтаксис" этой статьи, в котором используется ключевое слово Custom, обеспечивает такие возможности, позволяя определять настраиваемые события.The last syntax in the Syntax section of this topic, which uses the Custom keyword, provides that control by enabling you to define custom events. В настраиваемом событии можно точно указать, что происходит, когда код добавляет или удаляет обработчик события для события или когда код вызывает событие.In a custom event, you specify exactly what occurs when code adds or removes an event handler to or from the event, or when code raises the event. Примеры см. в разделах Практическое руководство. Объявление пользовательских событий для экономии памяти и как: Объявление пользовательских событий для предотвращения блокировки.For examples, see How to: Declare Custom Events To Conserve Memory and How to: Declare Custom Events To Avoid Blocking.

ПримерExample

В следующем примере события используются для выполнения обратного отсчета от 10 до 0 секунд.The following example uses events to count down seconds from 10 to 0. Код иллюстрирует различные связанные с событиями методы, свойства и операторы.The code illustrates several of the event-related methods, properties, and statements. В том числе оператор RaiseEvent.This includes the RaiseEvent statement.

Класс, который вызывает событие, является источником события, а методы, обрабатывающие события, — обработчиками событий.The class that raises an event is the event source, and the methods that process the event are the event handlers. Источник события может иметь несколько обработчиков для создаваемых им событий.An event source can have multiple handlers for the events it generates. Когда класс создает событие, это событие создается во всех классах, выбранных для обработки событий данного экземпляра объекта.When the class raises the event, that event is raised on every class that has elected to handle events for that instance of the object.

В примере также используется форма (Form1) с кнопкой (Button1) и текстовым полем (TextBox1).The example also uses a form (Form1) with a button (Button1) and a text box (TextBox1). При нажатии кнопки в первом текстовом поле отображается обратный отсчет от 10 до 0 секунд.When you click the button, the first text box displays a countdown from 10 to 0 seconds. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.When the full time (10 seconds) has elapsed, the first text box displays "Done".

Код для Form1 указывает начальное и конечное состояния формы.The code for Form1 specifies the initial and terminal states of the form. Он также содержит код, выполняемый при создании событий.It also contains the code executed when events are raised.

Чтобы использовать этот пример, откройте новый проект Windows Forms.To use this example, open a new Windows Forms project. Затем добавьте кнопку с именем Button1 и текстовое поле с именем TextBox1 в главную форму с именем Form1.Then add a button named Button1 and a text box named TextBox1 to the main form, named Form1. Затем щелкните правой кнопкой мыши форму и нажмите кнопку Просмотр кода чтобы открыть редактор кода.Then right-click the form and click View Code to open the code editor.

Добавьте переменную WithEvents в раздел объявлений класса Form1:Add a WithEvents variable to the declarations section of the Form1 class:

Private WithEvents mText As TimerState

Добавьте следующий код в код для Form1.Add the following code to the code for Form1. Замените все повторяющиеся процедуры, которые могут существовать, такие как Form_Load или Button_Click.Replace any duplicate procedures that may exist, such as Form_Load or 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 для запуска предыдущего примера и нажмите кнопку запустить.Press F5 to run the previous example, and click the button labeled Start. Первое текстовое поле начинает обратный отсчет.The first text box starts to count down the seconds. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.When the full time (10 seconds) has elapsed, the first text box displays "Done".

Примечание

Способ обработки событий методом My.Application.DoEvents отличается от обработки событий формой.The My.Application.DoEvents method does not process events in the same way the form does. Чтобы разрешить форме обрабатывать события напрямую, можно использовать многопоточность.To enable the form to handle the events directly, you can use multithreading. Дополнительные сведения см. в разделе управляемых потоков.For more information, see Managed Threading.

См. такжеSee also