Какой параметр в обработчике события передает объект события которое обрабатывается
Перейти к содержимому

Какой параметр в обработчике события передает объект события которое обрабатывается

  • автор:

Обработка и инициация событий

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

События

Событие — это сообщение, посланное объектом, чтобы сообщить о совершении действия. Это действие может быть вызвано пользовательским взаимодействием, например нажатием кнопки, или какой-то другой программной логикой, например изменением значения свойства. Объект, вызывающий событие, называется отправителем событий. Отправителю событий не известен объект или метод, который будет получать (обрабатывать) созданные им события. Обычно событие является членом отправителя событий; например, событие Click — член класса Button, а событие PropertyChanged — член класса, реализующего интерфейс INotifyPropertyChanged.

Чтобы определить событие, необходимо использовать ключевое слово event в C# или Event в Visual Basic в сигнатуре класса события и задать тип делегата для события. Делегаты описаны в следующем разделе.

Как правило, для вызова события добавляется метод, помеченный как protected и virtual (в C#) или Protected и Overridable (в Visual Basic). Назовите этот метод On EventName; например, OnDataReceived . Метод должен принимать один параметр, который определяет объект данных события, являющийся объектом типа EventArgs или производного типа. Этот метод предоставляется, чтобы производные классы могли переопределять логику для вызова события. Производный класс должен вызывать метод On EventName базового класса, чтобы зарегистрированные делегаты получили событие.

В следующем примере показан способ объявления события ThresholdReached . Событие связано с делегатом EventHandler и возникает в методе OnThresholdReached .

class Counter < public event EventHandler ThresholdReached; protected virtual void OnThresholdReached(EventArgs e) < EventHandler handler = ThresholdReached; handler?.Invoke(this, e); >// provide remaining implementation for the class > 
Public Class Counter Public Event ThresholdReached As EventHandler Protected Overridable Sub OnThresholdReached(e As EventArgs) RaiseEvent ThresholdReached(Me, e) End Sub ' provide remaining implementation for the class End Class 

Делегаты

Делегат — это тип, содержащий ссылку на метод. Делегат объявляется с сигнатурой, указывающей тип возвращаемого значения и параметры для методов, на которые он ссылается, и может содержать ссылки только на методы, соответствующие его сигнатуре. Таким образом, делегат эквивалентен указателю на строго типизированную функцию или обратному вызову. Объявления делегата достаточно для определения класса делегата.

У делегатов широкая область применения в .NET. В контексте событий делегат — это посредник (или механизм, подобный указателю) между источником события и кодом, обрабатывающим событие. Делегат связывается с событием за счет включения типа делегата в объявление события, как показано в примере в предыдущем разделе. Дополнительные сведения о делегатах см. в разделе, посвященном классу Delegate.

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

public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e); 
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs) 

Данные событий

Данные, связанные с событием, могут быть предоставлены с помощью класса данных события. .NET предоставляет множество классов данных событий, которые можно использовать в приложениях. Например, класс SerialDataReceivedEventArgs — класс данных события SerialPort.DataReceived. В .NET имена всех классов данных событий оканчиваются ключевым словом EventArgs . Определить, какой класс данных события связан с событием, можно по делегату этого события. Например, делегат SerialDataReceivedEventHandler содержит класс SerialDataReceivedEventArgs в качестве одного из своих параметров.

Класс EventArgs является базовым типом для всех классов данных событий. Класс EventArgs используется также, если событие не содержит связанных данных. При создании события, которое лишь уведомляет другие классы о том, что что-то произошло, и не передает никаких данных, используйте класс EventArgs в качестве второго параметра в делегате. Если данные не предоставляются, можно передать значение EventArgs.Empty. Делегат EventHandler содержит класс EventArgs в качестве параметра.

Если требуется создать пользовательский класс данных события, создайте класс, производный от класса EventArgs, а затем укажите все члены, необходимые для передачи данных, связанных с событием. В большинстве случаев следует использовать схему именования .NET и завершать имя класса данных события ключевым словом EventArgs .

В следующем примере показан класс данных события с именем ThresholdReachedEventArgs . Он содержит свойства, относящиеся только к вызываемому событию.

public class ThresholdReachedEventArgs : EventArgs < public int Threshold < get; set; >public DateTime TimeReached < get; set; >> 
Public Class ThresholdReachedEventArgs Inherits EventArgs Public Property Threshold As Integer Public Property TimeReached As DateTime End Class 

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

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

В следующем примере показан метод обработчика события c_ThresholdReached , который соответствует сигнатуре делегата EventHandler. Метод подписывается на событие ThresholdReached .

class Program < static void Main() < var c = new Counter(); c.ThresholdReached += c_ThresholdReached; // provide remaining implementation for the class >static void c_ThresholdReached(object sender, EventArgs e) < Console.WriteLine("The threshold was reached."); >> 
Module Module1 Sub Main() Dim c As New Counter() AddHandler c.ThresholdReached, AddressOf c_ThresholdReached ' provide remaining implementation for the class End Sub Sub c_ThresholdReached(sender As Object, e As EventArgs) Console.WriteLine("The threshold was reached.") End Sub End Module 

Обработчики статических и динамических событий

.NET позволяет подписчикам регистрироваться для получения уведомлений о событиях как статически, так и динамически. Обработчики статических событий действуют в течение всего жизненного цикла класса, события которого они обрабатывают. Обработчики динамических событий активируются и деактивируются во время выполнения программы, обычно в ответ на определенную условную логику программы. Например, они могут использоваться, если уведомления о событиях требуются только в определенных условиях, либо приложение предоставляет несколько обработчиков событий и выбор конкретного обработчика зависит от условий среды выполнения. В примере в предыдущем разделе показано, как динамически добавлять обработчик события. Дополнительные сведения см. в разделах события (в Visual Basic) и события (в C#).

Создание нескольких событий

Если класс создает несколько событий, компилятор создает одно поле для каждого экземпляра делегата события. При большом количестве событий стоимость хранения одного поля на делегата может оказаться неприемлемой. Для таких случаев .NET предоставляет свойства события, которые можно использовать вместе с другой структурой данных для хранения делегатов события.

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

Связанные статьи

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

См. также

  • EventHandler
  • EventHandler
  • EventArgs
  • Delegate
  • События (Visual Basic)
  • События (Руководство по программированию в C#)
  • Общие сведения о событиях и перенаправленных событиях (приложения для UWP)
  • События в приложениях Магазина Windows 8.x

Обработка события элемента управления (Windows Forms .NET)

События для элементов управления (и для форм) обычно задаются с помощью визуального конструктора Visual Studio для Windows Forms. Настройка события с помощью визуального конструктора называется обработкой события во время разработки. Вы также можете динамически обрабатывать события в коде — это называется обработкой событий во время выполнения. Событие, созданное во время выполнения, позволяет динамически подключать обработчики событий на основе текущих действий приложения.

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

Обработка события — конструктор

В Visual Studio используйте визуальный конструктор для управления обработчиками событий элементов управления. Визуальный конструктор создаст код обработчика и добавит его в событие.

Установка обработчика

Используйте панель Свойства, чтобы добавить или задать обработчик события:

  1. Откройте визуальный конструктор формы, содержащей элемент управления, который нужно изменить.
  2. Выберите элемент управления.
  3. Измените режим панели Свойства на События, нажав кнопку событий ().
  4. Найдите событие, к которому нужно добавить обработчик, например событие Click: Visual Studio properties pane shown with the events mode enabled and the click event.
  5. Выполните одно из следующих действий.
    • Дважды щелкните событие, чтобы создать новый обработчик. Оно пусто, если обработчик не назначен. Если оно не пусто, это действие открывает код формы и переходит к существующему обработчику.
    • Используйте поле выбора () для выбора существующего обработчика. В поле выбора будут перечислены все методы, имеющие совместимую сигнатуру метода для обработчика событий.

Очистка обработчика

Чтобы удалить обработчик событий, нельзя просто удалить код обработчика, который находится в файле кода программной части формы, на него по-прежнему ссылается событие. Используйте панель Свойства, чтобы удалить обработчик события:

  1. Откройте визуальный конструктор формы, содержащей элемент управления, который нужно изменить.
  2. Выберите элемент управления.
  3. Измените режим панели Свойства на События, нажав кнопку событий ().
  4. Найдите событие, содержащее обработчик, который требуется удалить, например событие Click: Visual Studio properties pane shown with the events mode enabled and the click event.
  5. Щелкните событие правой кнопкой мыши и выберите Сбросить.

Обработка события — код

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

Добавление обработчика

В следующем примере показано, как создать элемент управления и добавить обработчик событий. Этот элемент управления создается в обработчике событий Button.Click другой кнопкой. При нажатии Кнопки1. Код перемещает новую кнопку и изменяет ее размер. Событие новой кнопки Click обрабатывается методом MyNewButton_Click . Чтобы появилась новая кнопка, она добавляется в коллекцию формы Controls . Существует также код для удаления обработчика события Button1.Click , который рассматривается в разделе Удаление обработчика.

private void button1_Click(object sender, EventArgs e) < // Create and add the button Button myNewButton = new() < Location = new Point(10, 10), Size = new Size(120, 25), Text = "Do work" >; // Handle the Click event for the new button myNewButton.Click += MyNewButton_Click; this.Controls.Add(myNewButton); // Remove this button handler so the user cannot do this twice button1.Click -= button1_Click; > private void MyNewButton_Click(object sender, EventArgs e)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Create and add the button Dim myNewButton As New Button() With 'Handle the Click event for the new button AddHandler myNewButton.Click, AddressOf MyNewButton_Click Me.Controls.Add(myNewButton) 'Remove this button handler so the user cannot do this twice RemoveHandler Button1.Click, AddressOf Button1_Click End Sub Private Sub MyNewButton_Click(sender As Object, e As EventArgs) End Sub 

Чтобы выполнить этот код, выполните следующие действия в форме с помощью визуального конструктора Visual Studio:

  1. Добавьте новую кнопку в форму и назовите ее Кнопка1.
  2. Измените режим панели Свойства на События, нажав кнопку событий ().
  3. Дважды щелкните по событию Нажать, чтобы создать обработчик. Это действие открывает окно кода и создает пустой метод Button1_Click .
  4. Замените код метода приведенным выше кодом.

Дополнительные сведения о событиях C# см. в разделе События (C#). Дополнительные сведения о событиях Visual Basic см. в разделе События» (Visual Basic)

Удаление обработчика

В разделе Добавление обработчика использовался код для демонстрации добавления обработчика. Этот код также содержит вызов для удаления обработчика:

button1.Click -= button1_Click; 
RemoveHandler Button1.Click, AddressOf Button1_Click 

Этот синтаксис можно использовать для удаления любого обработчика событий из любого события.

Дополнительные сведения о событиях C# см. в разделе События (C#). Дополнительные сведения о событиях Visual Basic см. в разделе События» (Visual Basic)

Использование нескольких событий с одним и тем же обработчиком

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

В C# обработчик присоединяется к событию элемента управления в коде конструктора формы, который был изменен с помощью визуального конструктора. Дополнительные сведения о событиях C# см. в разделе Events (C#)

Visual Basic

В Visual Basic обработчик присоединяется к событию элемента управления в файле кода программной части формы, где объявляется код обработчика событий. В код обработчика событий можно добавить несколько ключевых слов Handles , чтобы использовать его с несколькими событиями. Визуальный конструктор создаст ключевое слово Handles и добавит его в обработчик событий. Однако, это можно легко сделать самостоятельно для любого события и обработчика событий элемента управления, если сигнатура метода обработчика соответствует событию. Дополнительные сведения о событиях Visual Basic см. в разделе События (Visual Basic)

В этом коде показано, как один и тот же метод можно использовать в качестве обработчика для двух разных событий Button.Click :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click 'Do some work to handle the events End Sub 

См. также

  • События элементов управления
  • Общие сведения о событиях
  • Использование событий мыши
  • Использование событий клавиатуры
  • System.Windows.Forms.Button

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Обзор обработчиков событий (Windows Forms)

Обработчик событий — это метод, привязанный к событию. При возникновении события выполняется код в обработчике событий. Каждый обработчик событий предоставляет два параметра, которые позволяют правильно обрабатывать событие. В следующем примере показан обработчик событий для события Click элемента управления Button.

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click End Sub 
private void button1_Click(object sender, System.EventArgs e)
private: void button1_Click(System::Object ^ sender, System::EventArgs ^ e)

Первый параметр ( sender ) предоставляет ссылку на объект, вызвавший событие. Второй параметр ( e в приведенном выше примере) передает объект, относящийся к обрабатываемому событию. Ссылаясь на свойства объекта (а иногда и его методы), можно получить такие сведения, как расположение мыши для событий мыши или данные, передаваемые в событиях перетаскивания.

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

Можно также использовать один и тот же обработчик событий для обработки одного и того же события в разных элементах управления. Например, если у вас в форме есть группа элементов управления RadioButton, можно создать один обработчик событий для события Click и привязать событие Click каждого элемента управления к этому обработчику событий. Дополнительные сведения см. в разделе Практическое руководство. Подключение нескольких событий к одному обработчику событий в Windows Forms.

См. также

  • Создание обработчиков событий в Windows Forms
  • Общие сведения о событиях

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Объект события

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/introduction-browser-events.

Чтобы хорошо обработать событие, недостаточно знать о том, что это – «клик» или «нажатие клавиши». Могут понадобиться детали: координаты курсора, введённый символ и другие, в зависимости от события.

Детали произошедшего браузер записывает в «объект события», который передаётся первым аргументом в обработчик.

Свойства объекта события

Пример ниже демонстрирует использование объекта события:

Свойства объекта event :

event.type Тип события, в данном случае click event.currentTarget Элемент, на котором сработал обработчик. Значение – в точности такое же, как и у this , но бывают ситуации, когда обработчик является методом объекта и его this при помощи bind привязан к этому объекту, тогда мы можем использовать event.currentTarget . event.clientX / event.clientY Координаты курсора в момент клика (относительно окна)

Есть также и ряд других свойств, в зависимости от событий, которые мы разберём в дальнейших главах, когда будем подробно знакомиться с событиями мыши, клавиатуры и так далее.

Объект события доступен и в HTML

При назначении обработчика в HTML, тоже можно использовать переменную event , это будет работать кросс-браузерно:

Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так: function(event) < alert(event.type) >. То есть, её первый аргумент называется «event» .

Особенности IE8-

IE8- вместо передачи параметра обработчику создаёт глобальный объект window.event . Обработчик может обратиться к нему.

Работает это так:

elem.onclick = function() < // window.event - объект события alert( window.event.clientX ); >;

Кроссбраузерное решение

Универсальное решение для получения объекта события:

element.onclick = function(event) < event = event || window.event; // (*) // Теперь event - объект события во всех браузерах. >;

Строка (*) , в случае, если функция не получила event (IE8-), использует window.event .-событие event .

Можно написать и иначе, если мы сами не используем переменную event в замыкании:

element.onclick = function(e) < e = e || event; // Теперь e - объект события во всех браузерах. >;

Итого

  • Объект события содержит ценную информацию о деталях события.
  • Он передаётся первым аргументом event в обработчик для всех браузеров, кроме IE8-, в которых используется глобальная переменная window.event .

Кросс-браузерно для JavaScript-обработчика получаем объект события так:

element.onclick = function(event) < event = event || window.event; // Теперь event - объект события во всех браузерах. >;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *