Создание обработчиков событий в Windows Forms
Обработчик событий — это процедура в коде, определяющая, какие действия должны выполняться при возникновении тех или иных событий, например, если пользователь нажимает кнопку или сообщение поступает в очередь. При порождении события запускается получивший его обработчик или несколько обработчиков. События могут назначаться сразу нескольким обработчикам, а методы, которые управляют конкретными событиями, можно изменять динамически. Для создания обработчиков событий можно также использовать Конструктор Windows Forms в Visual Studio.
В этом разделе
Общие сведения о событиях
Объясняет модель событий и роли делегатов.
Практическое руководство. Создание обработчиков событий для Windows Forms во время выполнения
Динамически выдает инструкции по реагированию на системные или пользовательские события.
Практическое руководство. Подключение нескольких событий к одному обработчику в Windows Forms
Выдает инструкции по назначению одной и той же функциональности нескольким элементам управления с помощью событий.
Порядок событий в формах Windows Forms
Описывает порядок порождения событий в элементах управления Windows Forms.
Практическое руководство. Создание обработчиков событий с помощью конструктора Описывает использование конструктора Windows Forms для создания обработчиков событий.
Связанные разделы
События
Содержит ссылки на разделы по обработке и порождению событий с помощью .NET Framework.
Устранение неполадок, связанных с унаследованными обработчиками событий, в Visual Basic
Представляет распространенные проблемы, возникающие у обработчиков событий в наследуемых компонентах.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Обработка события элемента управления (Windows Forms .NET)
События для элементов управления (и для форм) обычно задаются с помощью визуального конструктора Visual Studio для Windows Forms. Настройка события с помощью визуального конструктора называется обработкой события во время разработки. Вы также можете динамически обрабатывать события в коде — это называется обработкой событий во время выполнения. Событие, созданное во время выполнения, позволяет динамически подключать обработчики событий на основе текущих действий приложения.
Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.
Обработка события — конструктор
В Visual Studio используйте визуальный конструктор для управления обработчиками событий элементов управления. Визуальный конструктор создаст код обработчика и добавит его в событие.
Установка обработчика
Используйте панель Свойства, чтобы добавить или задать обработчик события:
- Откройте визуальный конструктор формы, содержащей элемент управления, который нужно изменить.
- Выберите элемент управления.
- Измените режим панели Свойства на События, нажав кнопку событий (
). - Найдите событие, к которому нужно добавить обработчик, например событие Click:

- Выполните одно из следующих действий.
- Дважды щелкните событие, чтобы создать новый обработчик. Оно пусто, если обработчик не назначен. Если оно не пусто, это действие открывает код формы и переходит к существующему обработчику.
- Используйте поле выбора (
) для выбора существующего обработчика. В поле выбора будут перечислены все методы, имеющие совместимую сигнатуру метода для обработчика событий.
Очистка обработчика
Чтобы удалить обработчик событий, нельзя просто удалить код обработчика, который находится в файле кода программной части формы, на него по-прежнему ссылается событие. Используйте панель Свойства, чтобы удалить обработчик события:
- Откройте визуальный конструктор формы, содержащей элемент управления, который нужно изменить.
- Выберите элемент управления.
- Измените режим панели Свойства на События, нажав кнопку событий (
). - Найдите событие, содержащее обработчик, который требуется удалить, например событие Click:

- Щелкните событие правой кнопкой мыши и выберите Сбросить.
Обработка события — код
Обычно обработчики событий добавляются в элементы управления во время разработки с помощью визуального конструктора. Однако, можно создавать элементы управления во время выполнения, что требует добавления обработчиков событий в код. Добавление обработчиков в код также дает возможность добавить несколько обработчиков в одно и то же событие.
Добавление обработчика
В следующем примере показано, как создать элемент управления и добавить обработчик событий. Этот элемент управления создается в обработчике событий 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.
- Измените режим панели Свойства на События, нажав кнопку событий ().
- Дважды щелкните по событию Нажать, чтобы создать обработчик. Это действие открывает окно кода и создает пустой метод Button1_Click .
- Замените код метода приведенным выше кодом.
Дополнительные сведения о событиях 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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Обработчики событий
идентифицируются в Plesk как события. Для каждого события вы можете создать один или более обработчиков, которые запускают предопределенную команду каждый раз, когда происходит это событие.
Обработчики событий полезны, если вы хотите, чтобы определенное действие или набор действий выполнялись каждый раз при совершении какого-либо события. Например, вы можете создать обработчик событий, который срабатывает каждый раз, когда создается подписка, и сконфигурировать его так, чтобы он автоматически создавал почтовый ящик, отправлял запрос к внешней службе и так далее.
Добавление обработчиков событий
- Перейдите на страницу Инструменты и настройки >Менеджер событий.
- Нажмите Добавить обработчик событий.
- Выберите событие, для которого вы хотите создать обработчик, из списка «Событие».
- В поле «Приоритет» установите приоритет выполнения обработчика, выбрав значение из списка или указав в поле произвольное число. Приоритет имеет значение, если вы назначаете несколько обработчиков одному событию. В этом случае обработчики срабатывают в порядке убывания приоритета (сначала срабатывает обработчик с наивысшим приоритетом, затем второй по приоритету и так далее).
- Выберите системного пользователя, от имени которого будет выполняться команда, из списка «Пользователь».
Примечание: Администратор сервера может создавать обработчики событий, которые будут запускаться на сервере от имени пользователя root. Если вы хотите запретить запуск обработчиков от имени пользователя root, создайте пустой файл с именем root.event_handler.lock в папке /usr/local/psa/var/ .
Примечание: Удостоверьтесь в том, что ваш скрипт имеет разрешение на выполнение. Это можно сделать, запустив следующую команду: chmod 755
Передача параметров событий
Каждый раз, когда обработчик события срабатывает, он передает определенные данные («параметры события»), связанные с событием (какие именно данные передаются ― зависит от конкретного обработчика событий). Например, обработчик события «Домен создан» передает следующие параметры:
- Имя вновь созданного домена.
- GUID вновь созданного домена.
- GUID учетной записи клиента, которому принадлежит вновь созданный домен.
Каждый параметр передается как переменная среды, которую вы можете использовать в shell-скриптах или файлах .bat следующим образом:
Plesk для Linux
Используйте замещающий символ $ (например, « $ ») в shell-скрипте. Когда обработчик события сработает, этот замещающий символ будет заменен значением, соответствующим происходящему событию.
Plesk для Windows
Используйте замещающий символ %N (например, « %1 ») в bat-файле и добавьте имя нужной переменной среды в соответствующем месте в конце команды в настройках обработчика событий. В следующем примере

замещающий символ « %1 » будет заменен значением переменной среды « NEW_DOMAIN_NAME », а « %2 » ― значением « NEW_DOMAIN_GUID ». Если вы используете замещающий символ « %3 » в файле .bat, он не будет ничем заменен, так как в конце команды было указано только две переменных среды.
Вы можете просмотреть полный список всех параметров событий и соответствующих им переменных среды для каждого обработчика событий здесь .
В качестве примера рассмотрим два скрипта для события ‘Учетная запись клиента создана’:
-
(Plesk для Linux) test-handler.sh
#!/bin/bash echo "--------------" >> /tmp/event_handler.log /bin/date >> /tmp/event_handler.log # information on the event date and time /usr/bin/id >> /tmp/event_handler.log # information on the user, on behalf of which the script was executed (to ensure control) echo "customer created" >> /tmp/event_handler.log # information on the created customer account echo "name: $NEW_CONTACT_NAME>" >> /tmp/event_handler.log # customer's name echo "login: $NEW_LOGIN_NAME>" >> /tmp/event_handler.log # customer's username in Plesk echo "--------------" >> /tmp/event_handler.log
echo "--------------" >> c:\windows\temp\event_handler.log rem information on the event date and time date /T >> c:\windows\temp\event_handler.log rem information on the created customer account echo "customer created" >> c:\windows\temp\event_handler.log rem customer's name echo "name: %1" >> c:\windows\temp\event_handler.log rem customer's username in Plesk echo "login: %2" >> c:\windows\temp\event_handler.log echo "--------------" >> c:\windows\temp\event_handler.log
Если вы войдете в Plesk и создадите учетную запись клиента с именем «John Doe» и именем пользователя “john_doe”, обработчик события сработает, и в файл event_handler.log будут добавлены следующие записи:
Fri Mar 16 15:57:25 NOVT 2007 uid=0(root) gid=0(root) groups=0(root) customer created name: John Doe login: john_doe
Mon March 15 21:46:34 NOVT 2010 customer created name: John Doe login: john_doe
Изменение и удаление обработчиков событий
Чтобы просмотреть список активных на данный момент обработчиков событий, перейдите в раздел Инструменты и настройки > Менеджер событий. Здесь вы можете также изменять и удалять обработчики событий:
- Чтобы изменить обработчик событий, нажмите его имя, выполните необходимые изменения и нажмите OK.
- Чтобы удалить обработчик событий, поставьте соответствующую галочку и нажмите Удалить.
Процедуры-обработчики событий
Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться. Данная статья написана, чтобы внести ясность в этом вопросе.
Обратите внимание, что термин «Предопределенная процедура», который использовался в версии 7.х, теперь заменен на «процедура-обработчик события» или просто «обработчик события».
| ПРАВИЛО №1. Если процедура-обработчик события относится к форме или элементу управления, то ее обязательно нужно указывать в палитре свойств для формы или элемента управления. |
Ниже показана палитра свойств для формы элемента справочника «Номенклатура» с несколькими назначенными обработчиками событий:

За информацией о приемах работы с этой частью палитры свойств обращайтесь к документации: книга «Конфигурирование и администрирование», «Глава 3. Объекты конфигурации => Свойства элементов управления => Категория свойств События» (стр. 1 — 204)
Обратите внимание на важный момент, имя процедуры-обработчика событий может не совпадать с именем события . Для элементов управления чаще всего так и бывает, например, процедура «ТипЦенПриИзменении» обрабатывает событие «ПриИзменении» поля ввода для реквизита «ТипЦен», как показано на следующем рисунке:

Как правило, процедура-обработчик имеет тот же набор параметров, что и событие. Если у нее нет соответствующих параметров, то обработка события может получиться неполной. Поэтому рекомендуется создавать процедуры-обработчики конструктором через палитру свойств, нажимая кнопку с лупой или выбирая процедуру из выпадающего списка.
Есть еще одна интересная возможность: одна и та же процедура может «обслуживать» несколько событий формы или элементов управления, в том числе от разных источников. Элемент управления, который инициировал событие, передается в качестве первого параметра в эту процедуру-обработчик (параметр «Элемент»), и при необходимости алгоритм может проанализировать, откуда пришло событие, и выполнить соответствующие действия.
| ПРАВИЛО №2. Процедуры-обработчики событий, расположенные в модуле приложения, модуле внешнего соединения, модуле прикладного объекта должны называться точно так, как называются соответствующие события. |
Поясним это правило на конкретных примерах:
1. Процедуры-обработчики событий, расположенные в модуле приложения или модуле внешнего соединения, совпадают с именами событий:
- ПередНачаломРаботыСистемы
- ПриНачалеРаботыСистемы
- ПриЗавершенииРаботыСистемы
- ПередЗавершениемРаботыСистемы
- ОбработкаВнешнегоСобытия
2. Имена процедур-обработчиков событий, расположенных в модуле объекта, тоже строго соответствуют именам событий:
для модуля документа (события объекта типа «ДокументОбъект»)
- ПередЗаписью
- ПриЗаписи
- ПриУдалении
- ПриКопировании
- ОбработкаЗаполнения (для обработки «ввода на основании»)
- ОбработкаПроведения
- ОбработкаУдаленияПроведения
- ПриУстановкеНовогоНомера
Аналогичные обработчики событий могут располагаться в модуле справочника и модулях других прикладных объектов.
3. Есть также модуль набора записей для всех видов регистров, который подобен модулям прикладных объектов. Модуль набора записей может содержать следующие процедуры-обработчики событий (имена процедур должны совпадать с именами событий):
- ПередЗаписью
- ПриЗаписи
Ниже приведены несколько важных моментов, которые полезно помнить при работе с событиями:
Примечание 1. Событие ПередЗаписью прикладного объекта отличается от события ПередЗаписью формы, связанной с этим прикладным объектом. Обработчик события в модуле формы вызывается при интерактивной записи, а обработчик в модуле объекта при любом способе записи элемента в базу данных.
Примечание 2. Если в процедурах-обработчиках модуля объекта нужно обратиться к самому объекту (текущий элемент справочника, текущий документ и т.д.), то для этого можно использовать свойство ЭтотОбъект. Оно содержит объект типа «СправочникОбъект», «ДокументОбъект» и т.д.
Примечание 3. Считается грубой ошибкой в процедурах-обработчиках событий объектов вызывать такие интерактивные команды, как Вопрос и Предупреждение. Эти команды показывают на экране диалоговое окно и ждут реакции пользователя. Так как событие обрабатывается в рамках транзакции, то это вызовет значительную задержку в обработке события и часть данных (или вся таблица) будет заблокирована на время ожидания.