События (Visual Basic)Events (Visual Basic)

Хотя вы можете визуализировать проект Visual Studio как последовательность процедур, выполняемых в последовательности, на самом деле большинство программ управляются событиями, то есть поток выполнения определяется внешними событиями, которые называются событием.While you might visualize a Visual Studio project as a series of procedures that execute in a sequence, in reality, most programs are event driven—meaning the flow of execution is determined by external occurrences called events.

Событие — это сигнал, который сообщает приложению, что произошло нечто важное.An event is a signal that informs an application that something important has occurred. Например, когда пользователь щелкает элемент управления на форме, эта форма инициирует событие Click и вызывает процедуру обработки события.For example, when a user clicks a control on a form, the form can raise a Click event and call a procedure that handles the event. События позволяют отдельным задачам взаимодействовать друг с другом.Events also allow separate tasks to communicate. Давайте представим, что приложение выполняет задачу по сортировке в отдельном процессе.Say, for example, that your application performs a sort task separately from the main application. Если пользователь отменит эту сортировку, приложение отправит событие отмены, по которому процесс сортировки завершит свою работу.If a user cancels the sort, your application can send a cancel event instructing the sort process to stop.

Термины и основные понятия для событийEvent Terms and Concepts

В этом разделе описываются термины и понятия, используемые для событий в Visual Basic.This section describes the terms and concepts used with events in Visual Basic.

Объявление событийDeclaring Events

События объявляются внутри классов, структур, модулей и интерфейсов с помощью ключевого слова Event, как показано в следующем примере:You declare events within classes, structures, modules, and interfaces using the Event keyword, as in the following example:

Event AnEvent(ByVal EventNumber As Integer)

Создание событийRaising Events

Событие действует как сообщение о том, что произошло нечто важное.An event is like a message announcing that something important has occurred. Рассылка такого сообщения называется созданием события.The act of broadcasting the message is called raising the event. В Visual Basic события инициируются с помощью RaiseEvent инструкции, как показано в следующем примере:In Visual Basic, you raise events with the RaiseEvent statement, as in the following example:

RaiseEvent AnEvent(EventNumber)

События должны создаваться в пределах области действия класса, модуля или структуры, в которых они объявлены.Events must be raised within the scope of the class, module, or structure where they are declared. Например, производный класс не может создавать события, унаследованные от базового класса.For example, a derived class cannot raise events inherited from a base class.

Отправители событийEvent Senders

Любой объект, способный создать событие, считается отправителем события или источником события.Any object capable of raising an event is an event sender, also known as an event source. Например, отправителями событий могут являться формы, элементы управления и пользовательские объекты.Forms, controls, and user-defined objects are examples of event senders.

Обработчики событийEvent Handlers

Обработчики событий — это процедуры, вызываемые при создании определенного события.Event handlers are procedures that are called when a corresponding event occurs. В качестве обработчика событий можно использовать любую допустимую подпрограмму с подходящей сигнатурой.You can use any valid subroutine with a matching signature as an event handler. Но в качестве обработчика событий нельзя использовать функцию, поскольку она не может возвращать значение источнику события.You cannot use a function as an event handler, however, because it cannot return a value to the event source.

Visual Basic использует стандартное соглашение об именовании для обработчиков событий, объединяющее имя отправителя события, символ подчеркивания и имя события.Visual Basic uses a standard naming convention for event handlers that combines the name of the event sender, an underscore, and the name of the event. Например, событие Click для кнопки с именем button1 будет называться Sub button1_Click.For example, the Click event of a button named button1 would be named Sub button1_Click.

Примечание

Мы рекомендуем придерживаться этого соглашения об именовании при создании обработчиков событий и для пользовательских событий. Но это не обязательное условие, вы можете использовать любое допустимое имя процедуры.We recommend that you use this naming convention when defining event handlers for your own events, but it is not required; you can use any valid subroutine name.

Связывание событий с обработчиками событийAssociating Events with Event Handlers

Чтобы обработчик событий мог выполнять свою функцию, его следует связать с соответствующим событием с помощью инструкции Handles или AddHandler.Before an event handler becomes usable, you must first associate it with an event by using either the Handles or AddHandler statement.

Оператор WithEvents и предложение HandlesWithEvents and the Handles Clause

Инструкция WithEvents и предложение Handles предоставляют декларативный способ указания обработчиков событий.The WithEvents statement and Handles clause provide a declarative way of specifying event handlers. Если объект объявлен с ключевым словом WithEvents, созданные им события могут обрабатываться любой процедурой с инструкцией Handles для этого события, как показано в следующем примере:An event raised by an object declared with the WithEvents keyword can be handled by any procedure with a Handles statement for that event, as shown in the following example:

' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.
Sub TestEvents()
    EClass.RaiseEvents()
End Sub

' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
    MsgBox("Received Event.")
End Sub

Class EventClass
    Public Event XEvent()
    Public Event YEvent()
    ' RaiseEvents raises both events.
    Sub RaiseEvents()
        RaiseEvent XEvent()
        RaiseEvent YEvent()
    End Sub
End Class

Инструкция WithEvents и предложение Handles часто являются наилучшим решением для обработки событий, так как декларативный синтаксис позволяет легко создавать, читать и отлаживать код программы.The WithEvents statement and the Handles clause are often the best choice for event handlers because the declarative syntax they use makes event handling easier to code, read and debug. Но использование переменных WithEvents имеет ряд ограничений.However, be aware of the following limitations on the use of WithEvents variables:

  • Нельзя использовать переменную WithEvents в качестве переменной объекта.You cannot use a WithEvents variable as an object variable. То есть вы не можете объявить ее как Object. При объявлении переменной необходимо указать имя класса.That is, you cannot declare it as Object—you must specify the class name when you declare the variable.

  • Так как общие события не привязаны к экземплярам класса, нельзя WithEvents использовать для декларативной обработки общих событий.Because shared events are not tied to class instances, you cannot use WithEvents to declaratively handle shared events. Аналогично, нельзя использовать WithEvents или Handles для обработки событий от Structure.Similarly, you cannot use WithEvents or Handles to handle events from a Structure. В обоих случаях для обработки таких событий можно использовать инструкцию AddHandler.In both cases, you can use the AddHandler statement to handle those events.

  • Вы не можете создавать массивы переменных типа WithEvents.You cannot create arrays of WithEvents variables.

Переменные WithEvents позволяют одному обработчику событий обрабатывать один или несколько видов событий. Также можно создать несколько обработчиков для одного вида событий.WithEvents variables allow a single event handler to handle one or more kind of event, or one or more event handlers to handle the same kind of event.

Предложение Handles является стандартным способом связывания события с обработчиком событий, но оно ограничено тем, что может связывать события с обработчиками событий только во время компиляции.Although the Handles clause is the standard way of associating an event with an event handler, it is limited to associating events with event handlers at compile time.

В некоторых случаях, например с событиями, связанными с формами или элементами управления, Visual Basic автоматически задействует пустой обработчик событий и связывает его с событием.In some cases, such as with events associated with forms or controls, Visual Basic automatically stubs out an empty event handler and associates it with an event. Например, если дважды щелкнуть кнопку команды в форме в режиме конструктора, Visual Basic создает пустой обработчик событий и WithEvents переменную для кнопки Command, как показано в следующем коде:For example, when you double-click a command button on a form in design mode, Visual Basic creates an empty event handler and a WithEvents variable for the command button, as in the following code:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler и RemoveHandlerAddHandler and RemoveHandler

Инструкция AddHandler похожа на предложение Handles, поскольку тоже позволяет задавать обработчик событий.The AddHandler statement is similar to the Handles clause in that both allow you to specify an event handler. Но AddHandler в сочетании с RemoveHandler обеспечивает большую гибкость, чем предложение Handles. Она позволяет динамически добавлять, удалять и изменять обработчики событий, связанные с событием.However, AddHandler, used with RemoveHandler, provides greater flexibility than the Handles clause, allowing you to dynamically add, remove, and change the event handler associated with an event. Если вы хотите обрабатывать общие события или события от структуры, необходимо использовать AddHandler.If you want to handle shared events or events from a structure, you must use AddHandler.

AddHandler принимает два аргумента: имя события, которое предоставляет отправитель события, например элемент управления, и выражение, определяющее делегат.AddHandler takes two arguments: the name of an event from an event sender such as a control, and an expression that evaluates to a delegate. Класс делегата при использовании AddHandler не обязательно указывать явно, поскольку инструкция AddressOf всегда возвращает ссылку на делегат.You do not need to explicitly specify the delegate class when using AddHandler, since the AddressOf statement always returns a reference to the delegate. Следующий пример связывает обработчик событий с событием, создаваемым объектом:The following example associates an event handler with an event raised by an object:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

Инструкция RemoveHandler, которая отсоединяет событие от обработчика событий, использует такой же синтаксис, как AddHandler.RemoveHandler, which disconnects an event from an event handler, uses the same syntax as AddHandler. Например:For example:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

В следующем примере обработчик событий связывается с событием, а затем создается событие.In the following example, an event handler is associated with an event, and the event is raised. Обработчик событий перехватывает это событие и выводит сообщение.The event handler catches the event and displays a message.

Затем первый обработчик событий удаляется, а с этим событием связывается другой обработчик событий.Then the first event handler is removed and a different event handler is associated with the event. Теперь событие создается снова и отображается другое сообщение.When the event is raised again, a different message is displayed.

Наконец, второй обработчик событий удаляется и событие создается в третий раз.Finally, the second event handler is removed and the event is raised for a third time. Поскольку теперь нет обработчиков событий, связанных с этим событием, никакие действия не выполняются.Because there is no longer an event handler associated with the event, no action is taken.

Module Module1

    Sub Main()
        Dim c1 As New Class1
        ' Associate an event handler with an event.
        AddHandler c1.AnEvent, AddressOf EventHandler1
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler1
        ' Now associate a different event handler with the event.
        AddHandler c1.AnEvent, AddressOf EventHandler2
        ' Call a method to raise the event.
        c1.CauseTheEvent()
        ' Stop handling the event.
        RemoveHandler c1.AnEvent, AddressOf EventHandler2
        ' This event will not be handled.
        c1.CauseTheEvent()
    End Sub

    Sub EventHandler1()
        ' Handle the event.
        MsgBox("EventHandler1 caught event.")
    End Sub

    Sub EventHandler2()
        ' Handle the event.
        MsgBox("EventHandler2 caught event.")
    End Sub

    Public Class Class1
        ' Declare an event.
        Public Event AnEvent()
        Sub CauseTheEvent()
            ' Raise an event.
            RaiseEvent AnEvent()
        End Sub
    End Class

End Module

Обработка событий, наследуемых от базового классаHandling Events Inherited from a Base Class

Производные классы, которые наследуют характеристики из базового класса, могут обрабатывать события, создаваемые этим базовым классом, используя инструкцию Handles MyBase.Derived classes—classes that inherit characteristics from a base class—can handle events raised by their base class using the Handles MyBase statement.

Обработка событий из базового классаTo handle events from a base class

  • Объявите обработчик событий в производном классе, добавив инструкцию Handles MyBase.eventname в строку объявления процедуры обработчика событий, где eventname — это имя события в базовом классе, которое вы хотите обрабатывать.Declare an event handler in the derived class by adding a Handles MyBase.eventname statement to the declaration line of your event-handler procedure, where eventname is the name of the event in the base class you are handling. Например:For example:

    Public Class BaseClass
        Public Event BaseEvent(ByVal i As Integer)
        ' Place methods and properties here.
    End Class
    
    Public Class DerivedClass
        Inherits BaseClass
        Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent
            ' Place code to handle events from BaseClass here.
        End Sub
    End Class
    
ЗаголовокTitle ОписаниеDescription
Пошаговое руководство: Объявление и создание событийWalkthrough: Declaring and Raising Events Предоставляет пошаговую инструкцию для объявления и создания событий класса.Provides a step-by-step description of how to declare and raise events for a class.
Пошаговое руководство: Обработка событийWalkthrough: Handling Events Описывает способ создания процедуры обработчика событий.Demonstrates how to write an event-handler procedure.
Практическое руководство. Объявите пользовательские события, чтобы избежать блокировкиHow to: Declare Custom Events To Avoid Blocking Показывает, как определить пользовательское событие, которое позволяет асинхронно вызывать обработчики событий.Demonstrates how to define a custom event that allows its event handlers to be called asynchronously.
Практическое руководство. Объявление пользовательских событий для экономии памятиHow to: Declare Custom Events To Conserve Memory Показывает, как определить пользовательское событие, которое использует память только при обработке события.Demonstrates how to define a custom event that uses memory only when the event is handled.
Устранение неполадок, связанных с унаследованными обработчиками событий, в Visual BasicTroubleshooting Inherited Event Handlers in Visual Basic Перечисляет распространенные проблемы, возникающие для обработчиков событий в наследуемых компонентах.Lists common issues that arise with event handlers in inherited components.
СобытияEvents Обзор модели событий .NET Framework.Provides an overview of the event model in the .NET Framework.
Создание обработчиков событий в Windows FormsCreating Event Handlers in Windows Forms Описывает, как работать с событиями, связанными с объектами Windows Forms.Describes how to work with events associated with Windows Forms objects.
ДелегатыDelegates Предоставляет обзор делегатов в Visual Basic.Provides an overview of delegates in Visual Basic.