Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хотя можно визуализировать проект Visual Studio в виде ряда процедур, выполняемых в последовательности, в действительности, большинство программ управляются событиями, то есть поток выполнения определяется внешними вхождениями, называемыми событиями.
Событие представляет собой сигнал, который сообщает приложению о том, что произошло что-то важное. Например, когда пользователь щелкает элемент управления в форме, форма может вызвать Click
событие и вызвать процедуру, которая обрабатывает событие. События также позволяют взаимодействовать отдельным задачам. Предположим, например, что приложение выполняет задачу сортировки отдельно от основного приложения. Если пользователь отменяет сортировку, ваше приложение может отправить событие отмены, передавая инструкции для остановки процесса сортировки.
Термины и понятия событий
В этом разделе описываются термины и понятия, используемые с событиями в Visual Basic.
Объявление событий
Вы объявляете события в классах, структурах, модулях и интерфейсах с помощью ключевого Event
слова, как показано в следующем примере:
Event AnEvent(ByVal EventNumber As Integer)
Вызов событий
Событие похоже на сообщение о том, что произошло что-то важное. Акт передачи сообщения называется запуском события. В Visual Basic вы создаете события с помощью инструкции RaiseEvent
, как показано в следующем примере:
RaiseEvent AnEvent(EventNumber)
События должны быть вызваны в пределах области класса, модуля или структуры, в которой они объявлены. Например, производный класс не может вызывать события, унаследованные от базового класса.
Отправители событий
Любой объект, способный вызывать событие, является отправителем событий, также известным как источник событий. Формы, элементы управления и определяемые пользователем объекты являются примерами отправителей событий.
Обработчики событий
Обработчики событий — это процедуры, вызываемые при возникновении соответствующего события. В качестве обработчика событий можно использовать любую действительную подпрограмму с соответствующей сигнатурой. Однако нельзя использовать функцию в качестве обработчика событий, так как она не может возвращать значение источнику событий.
Visual Basic использует стандартное соглашение об именовании для обработчиков событий, объединяющее имя отправителя события, подчёркивание и имя события. Например, событие кнопки с именем Click
будет называться button1
.
Замечание
Мы рекомендуем использовать это соглашение об именовании при определении обработчиков ваших собственных событий, но это не обязательно; можно использовать любое допустимое имя подпрограммы.
Связывание событий с обработчиками событий
Прежде чем обработчик событий станет доступным для использования, необходимо сначала связать его с событием, используя либо инструкцию Handles
, либо инструкцию AddHandler
.
WithEvents и предложение Handles
Оператор WithEvents
и конструкция Handles
предоставляют декларативный способ указания обработчиков событий. Событие, созданное объектом, объявленным ключевым WithEvents
словом, может обрабатываться любой процедурой, имеющей оператор Handles
для этого события, как показано в следующем примере:
' 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
часто являются лучшим выбором для обработчиков событий, поскольку декларативный синтаксис, который они используют, упрощает кодирование, чтение и отладку обработки событий. Однако помните о следующих ограничениях на использование WithEvents
переменных:
Нельзя использовать переменную
WithEvents
в качестве объектной переменной. То есть вы не можете объявить его какObject
— при объявлении переменной необходимо указать имя класса.Так как общие события не привязаны к экземплярам класса, нельзя использовать
WithEvents
для декларативной обработки общих событий. Аналогичным образом, вы не можете использоватьWithEvents
илиHandles
для обработки событий изStructure
. В обоих случаях можно использовать инструкциюAddHandler
для обработки этих событий.Невозможно создать массивы
WithEvents
переменных.
WithEvents
переменные позволяют одному обработчику событий обрабатывать одно или несколько типов событий или один или несколько обработчиков событий для обработки одного и того же типа события.
Handles
Хотя предложение является стандартным способом связывания события с обработчиком событий, он ограничен связыванием событий с обработчиками событий во время компиляции.
В некоторых случаях, например с событиями, связанными с формами или элементами управления, Visual Basic автоматически заглушает пустой обработчик событий и связывает его с событием. Например, при двойном нажатии кнопки команды в форме в режиме конструктора Visual Basic создает пустой обработчик событий и WithEvents
переменную для кнопки команды, как показано в следующем коде:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler и RemoveHandler
Инструкция AddHandler
аналогична предложению Handles
, так как оба позволяют указать обработчик событий. Однако AddHandler
, используемый с RemoveHandler
, обеспечивает большую гибкость, чем условие Handles
, позволяя динамически добавлять, удалять и изменять обработчик событий, связанный с событием. Если вы хотите обрабатывать общие события или события из структуры, необходимо использовать AddHandler
.
AddHandler
принимает два аргумента: имя события от отправителя события, например элемента управления, и выражение, которое вычисляется делегатом. При использовании AddHandler
не нужно явно указывать класс делегата, так как AddressOf
инструкция всегда возвращает ссылку на делегат. В следующем примере обработчик событий связывается с событием, вызываемым объектом:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, который отключает событие от обработчика событий, использует тот же синтаксис, что AddHandler
и . Рассмотрим пример.
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
В следующем примере обработчик событий ассоциируется с событием, после чего событие генерируется. Обработчик событий перехватывает событие и отображает сообщение.
Затем первый обработчик событий удаляется, а другой обработчик событий связан с событием. При повторном возникновении события отображается другое сообщение.
Наконец, второй обработчик событий удаляется, и событие вызывается в третий раз. Так как обработчик событий больше не связан с событием, действие не выполняется.
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
Обработка событий, унаследованных от базового класса
Производные классы — классы, наследующие характеристики базового класса, могут обрабатывать события, создаваемые их базовым классом с помощью инструкции Handles MyBase
.
Для обработки событий из базового класса
Объявите обработчик событий в производном классе, добавив
Handles MyBase.
инструкцию eventname в строку объявления процедуры обработчика событий, где имя события — это имя события в базовом классе, который вы обрабатываете. Рассмотрим пример.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
Связанные разделы
Название | Описание |
---|---|
Практическое руководство: Объявление и инициация событий | Содержит пошаговое описание того, как объявлять и вызывать события для класса. |
Пошаговое руководство. Обработка событий | Демонстрирует, как написать процедуру обработчика событий. |
Практическое руководство. Объявление пользовательских событий для предотвращения блокировки | Демонстрируется определение настраиваемого события, которое позволяет асинхронно вызывать обработчики событий. |
Как объявить пользовательские события для экономии памяти | Показывает, как определить настраиваемое событие, использующее память только при обработке события. |
Диагностика и устранение проблем с унаследованными обработчиками событий в Visual Basic | Перечисляет распространенные проблемы, возникающие с обработчиками событий в унаследованных компонентах. |
События | Общие сведения о модели событий в .NET Framework. |
Создание обработчиков событий в Windows Forms | Описывает работу с событиями, связанными с объектами Windows Forms. |
делегаты | Общие сведения о делегатах в Visual Basic. |