Общие сведения о событиях (Windows Forms)
Событие — это действие, требующее реагирования или "обработки" в коде. События могут генерироваться действиями пользователя (например, нажатием кнопки мыши или клавиши на клавиатуре), программным кодом или системой.
Приложения, управляемые событиями, выполняют код в ответ на событие. Каждая форма и элемент управления имеют предопределенный набор событий, который можно запрограммировать. Если возникает такое событие, а в соответствующем обработчике событий имеется код, этот код выполняется.
Типы порождаемых объектом событий могут варьироваться, но многие их них стандартны для большинства элементов управления. Например, большинство объектов обработают событие Click. Если пользователь откроет форму, в форме сработает код обработчика события Click.
Note
Многие события возникают вместе с другими событиями. Например, при возникновении события DoubleClick возникают также события MouseDown, MouseUp и Click.
Сведения о том, как вызывать и получать события, см. в разделе события.
Делегаты и их роли
Делегатами являются классы, которые обычно используются в .NET Framework для построения механизмов обработки событий. Делегаты напоминают указатели функций, активно применяемые в Visual C++ и других объектно-ориентированных языках. В отличие от указателей функций делегаты объектно-ориентированы, типобезопасны и безопасны. К тому же, если указатель функций содержит только ссылку на определенную функцию, то делегат содержит ссылку на объект и ссылки на один или несколько методов в этом объекте.
Эта модель событий использует делегаты для привязки событий к методам, которые используются для их обработки. Делегаты позволяют другим классам записывать уведомление о событии, определяя метод обработки. При возникновении события делегат вызывает соответствующий метод. Дополнительные сведения об определении делегатов см. в разделе события.
Делегаты можно связать с одним или несколькими методами, создав так называемую многоадресную рассылку. При создании делегата для события вы (или Конструктор Windows Forms) обычно создаете событие многоадресной рассылки. Редким исключением является событие, вызывающее выполнение определенной процедуры (например, отображение диалогового окна), которая не будет логически повторяться несколько раз за событие. Сведения о том, как создать многоадресный делегат, см. в разделе как: Объединение делегатов (многоадресные делегаты).
Делегат многоадресной рассылки поддерживает список вызова методов, к которым он привязан. Делегат многоадресной рассылки поддерживает метод Combine, позволяющий добавить метод в список вызова, и метод Remove, позволяющий его удалить.
Когда приложение регистрирует событие, элемент управления порождает это событие, вызывая для него делегат. Делегат, в свою очередь, вызывает соответствующий метод. В самом распространенном случае (делегат многоадресной рассылки) делегат вызывает каждый метод связки из списка вызова по очереди, что обеспечивает уведомление один-ко-многим. Данная стратегия означает, что элементу управления не нужно вести список целевых объектов для уведомления о событии, поскольку записью и уведомлением занимается делегат.
Делегаты также позволяют связать с одним методом несколько событий, чтобы использовать уведомление по типу многие-к-одному. Например, событие нажатия на кнопку и событие выбора команды в меню вызывают один и тот же делегат, который вызывает один и тот же метод, обрабатывающий эти события одинаковым образом.
В делегатах используется динамический механизм связки: во время выполнения делегат может быть связан с любым методом, подпись которого совпадает с подписью обработчика событий. С помощью этой функции можно устанавливать или изменять метод связки в зависимости от условий и динамически привязывать обработчик событий к элементу управления.