Обработчики события windows form

Порядок событий в формах Windows Forms Order of Events in Windows Forms

Особый интерес для разработчиков представляет порядок, в котором вызываются события в приложениях Windows Forms, для обеспечения обработки каждого из этих событий в свою очередь. The order in which events are raised in Windows Forms applications is of particular interest to developers concerned with handling each of these events in turn. Если ситуация требует аккуратной обработки событий, например когда производится перерисовка части формы, то необходимо знать точный порядок, в котором вызываются события во время выполнения. When a situation calls for meticulous handling of events, such as when you are redrawing parts of the form, an awareness of the precise order in which events are raised at run time is necessary. В этом разделе приведены некоторые сведения о порядке событий, возникающих на нескольких важных этапах жизненного цикла приложений и элементов управления. This topic provides some details on the order of events during several important stages in the lifetime of applications and controls. Конкретные сведения о порядке событий ввода мыши см. в разделе события мыши в Windows Forms. For specific details about the order of mouse input events, see Mouse Events in Windows Forms. Общие сведения о событиях в Windows Forms см. в разделе Общие сведения о событиях. For an overview of events in Windows Forms, see Events Overview. Дополнительные сведения о описывающего обработчиков событий см. в разделе Общие сведения об обработчиках событий. For details about the makeup of event handlers, see Event Handlers Overview.

События запуска и завершения работы приложения Application Startup and Shutdown Events

Классы Form и Control предоставляют набор событий, связанных с запуском и завершением приложения. The Form and Control classes expose a set of events related to application startup and shutdown. При запуске приложения Windows Forms события запуска главной формы вызываются в следующем порядке: When a Windows Forms application starts, the startup events of the main form are raised in the following order:

При закрытии приложения события запуска главной формы вызываются в следующем порядке: When an application closes, the shutdown events of the main form are raised in the following order:

Событие ApplicationExit класса Application вызывается после событий завершения работы основной формы. The ApplicationExit event of the Application class is raised after the shutdown events of the main form.

В Visual Basic 2005 содержатся дополнительные события приложений, такие как WindowsFormsApplicationBase.Startup и WindowsFormsApplicationBase.Shutdown. Visual Basic 2005 includes additional application events, such as WindowsFormsApplicationBase.Startup and WindowsFormsApplicationBase.Shutdown.

События, связанные с фокусом и проверками Focus and Validation Events

При изменении фокуса с помощью клавиатуры (при нажатии клавиш TAB, SHIFT+TAB и так далее), путем вызова методов Select или SelectNextControl, либо присвоением свойства ActiveControl текущей форме, события фокуса ввода класса Control происходят в следующем порядке: When you change the focus by using the keyboard (TAB, SHIFT+TAB, and so on), by calling the Select or SelectNextControl methods, or by setting the ActiveControl property to the current form, focus events of the Control class occur in the following order:

При изменении фокуса ввода с помощью мыши или путем вызова метода Focus события фокуса класса Control происходят в следующем порядке. When you change the focus by using the mouse or by calling the Focus method, focus events of the Control class occur in the following order:

Общие сведения о событиях (Windows Forms) Events Overview (Windows Forms)

Событие — это действие, требующее реагирования или «обработки» в коде. An event is an action which you can respond to, or «handle,» in code. События могут генерироваться действиями пользователя (например, нажатием кнопки мыши или клавиши на клавиатуре), программным кодом или системой. Events can be generated by a user action, such as clicking the mouse or pressing a key; by program code; or by the system.

Приложения, управляемые событиями, выполняют код в ответ на событие. Event-driven applications execute code in response to an event. Каждая форма и элемент управления имеют предопределенный набор событий, который можно запрограммировать. Each form and control exposes a predefined set of events that you can program against. Если возникает такое событие, а в соответствующем обработчике событий имеется код, этот код выполняется. If one of these events occurs and there is code in the associated event handler, that code is invoked.

Типы порождаемых объектом событий могут варьироваться, но многие их них стандартны для большинства элементов управления. The types of events raised by an object vary, but many types are common to most controls. Например, большинство объектов обработают событие Click. For example, most objects will handle a Click event. Если пользователь откроет форму, в форме сработает код обработчика события Click. If a user clicks a form, code in the form’s Click event handler is executed.

Многие события возникают вместе с другими событиями. Many events occur in conjunction with other events. Например, при возникновении события DoubleClick возникают также события MouseDown, MouseUp и Click. For example, in the course of the DoubleClick event occurring, the MouseDown, MouseUp, and Click events occur.

Сведения о том, как вызывать и использовать событие, см. в разделе события. For information about how to raise and consume an event, see Events.

Делегаты и их роли Delegates and Their Role

Делегаты — это классы, обычно используемые в .NET Framework для создания механизмов обработки событий. Delegates are classes commonly used within the .NET Framework to build event-handling mechanisms. Делегаты приблизительно соответствуют указателям на функции, обычно используемым в Visual C++ и других объектно-ориентированных языках. Delegates roughly equate to function pointers, commonly used in Visual C++ and other object-oriented languages. В отличие от указателей функций делегаты объектно-ориентированы, типобезопасны и безопасны. Unlike function pointers however, delegates are object-oriented, type-safe, and secure. К тому же, если указатель функций содержит только ссылку на определенную функцию, то делегат содержит ссылку на объект и ссылки на один или несколько методов в этом объекте. In addition, where a function pointer contains only a reference to a particular function, a delegate consists of a reference to an object, and references to one or more methods within the object.

Эта модель событий использует делегаты для привязки событий к методам, которые используются для их обработки. This event model uses delegates to bind events to the methods that are used to handle them. Делегаты позволяют другим классам записывать уведомление о событии, определяя метод обработки. The delegate enables other classes to register for event notification by specifying a handler method. При возникновении события делегат вызывает соответствующий метод. When the event occurs, the delegate calls the bound method. Дополнительные сведения об определении делегатов см. в разделе события. For more information about how to define delegates, see Events.

Читайте также:  Fix ssd windows 10

Делегаты можно связать с одним или несколькими методами, создав так называемую многоадресную рассылку. Delegates can be bound to a single method or to multiple methods, referred to as multicasting. При создании делегата для события обычно создается многоадресное событие (или Windows). When creating a delegate for an event, you (or the Windows) typically create a multicast event. Редким исключением является событие, вызывающее выполнение определенной процедуры (например, отображение диалогового окна), которая не будет логически повторяться несколько раз за событие. A rare exception might be an event that results in a specific procedure (such as displaying a dialog box) that would not logically repeat multiple times per event. Сведения о создании делегата многоадресной рассылки см. в разделе Объединение делегатов (многоадресные делегаты). For information about how to create a multicast delegate, see How to combine delegates (Multicast Delegates).

Делегат многоадресной рассылки поддерживает список вызова методов, к которым он привязан. A multicast delegate maintains an invocation list of the methods it is bound to. Делегат многоадресной рассылки поддерживает метод Combine, позволяющий добавить метод в список вызова, и метод Remove, позволяющий его удалить. The multicast delegate supports a Combine method to add a method to the invocation list and a Remove method to remove it.

Когда приложение регистрирует событие, элемент управления порождает это событие, вызывая для него делегат. When an event is recorded by the application, the control raises the event by invoking the delegate for that event. Делегат, в свою очередь, вызывает соответствующий метод. The delegate in turn calls the bound method. В самом распространенном случае (делегат многоадресной рассылки) делегат вызывает каждый метод связки из списка вызова по очереди, что обеспечивает уведомление один-ко-многим. In the most common case (a multicast delegate) the delegate calls each bound method in the invocation list in turn, which provides a one-to-many notification. Данная стратегия означает, что элементу управления не нужно вести список целевых объектов для уведомления о событии, поскольку записью и уведомлением занимается делегат. This strategy means that the control does not need to maintain a list of target objects for event notification—the delegate handles all registration and notification.

Делегаты также позволяют связать с одним методом несколько событий, чтобы использовать уведомление по типу многие-к-одному. Delegates also enable multiple events to be bound to the same method, allowing a many-to-one notification. Например, событие нажатия на кнопку и событие выбора команды в меню вызывают один и тот же делегат, который вызывает один и тот же метод, обрабатывающий эти события одинаковым образом. For example, a button-click event and a menu-command–click event can both invoke the same delegate, which then calls a single method to handle these separate events the same way.

В делегатах используется динамический механизм связки: во время выполнения делегат может быть связан с любым методом, подпись которого совпадает с подписью обработчика событий. The binding mechanism used with delegates is dynamic: a delegate can be bound at run time to any method whose signature matches that of the event handler. С помощью этой функции можно устанавливать или изменять метод связки в зависимости от условий и динамически привязывать обработчик событий к элементу управления. With this feature, you can set up or change the bound method depending on a condition and to dynamically attach an event handler to a control.

Создание обработчиков событий в Windows Forms Creating Event Handlers in Windows Forms

Обработчик событий — это процедура в коде, определяющая, какие действия должны выполняться при возникновении тех или иных событий, например, если пользователь нажимает кнопку или сообщение поступает в очередь. An event handler is a procedure in your code that determines what actions are performed when an event occurs, such as when the user clicks a button or a message queue receives a message. При порождении события запускается получивший его обработчик или несколько обработчиков. When an event is raised, the event handler or handlers that receive the event are executed. События могут назначаться сразу нескольким обработчикам, а методы, которые управляют конкретными событиями, можно изменять динамически. Events can be assigned to multiple handlers, and the methods that handle particular events can be changed dynamically. Для создания обработчиков событий также можно использовать конструктор Windows Forms в Visual Studio. You can also use the Windows Forms Designer in Visual Studio to create event handlers.

в этом разделе In This Section

Общие сведения о событиях Events Overview
Объясняет модель событий и роли делегатов. Explains the event model and the role of delegates.

Общие сведения об обработчиках событий Event Handlers Overview
Описывает порядок обработки событий. Describes how to handle events.

Практические руководства. Создание обработчиков событий во время выполнения для Windows Forms How to: Create Event Handlers at Run Time for Windows Forms
Динамически выдает инструкции по реагированию на системные или пользовательские события. Gives directions for responding to system or user events dynamically.

Как подключить несколько событий к одному обработчику событий в Windows Forms How to: Connect Multiple Events to a Single Event Handler in Windows Forms
Выдает инструкции по назначению одной и той же функциональности нескольким элементам управления с помощью событий. Gives directions for assigning the same functionality to multiple controls through events.

Порядок событий в Windows Forms Order of Events in Windows Forms
Описывает порядок порождения событий в элементах управления Windows Forms. Describes the order in which events are raised in Windows Forms controls.

Инструкции. Создание обработчиков событий с помощью конструктора Описывает, как использовать конструктор Windows Forms для создания обработчиков событий. How to: Create Event Handlers Using the Designer Describes how to use the Windows Forms Designer to create event handlers.

Событиях Events
Содержит ссылки на разделы, посвященные обработке и вызову событий с помощью .NET Framework. Provides links to topics on handling and raising events using the .NET Framework.

Устранение неполадок унаследованных обработчиков событий в Visual Basic Troubleshooting Inherited Event Handlers in Visual Basic
Представляет распространенные проблемы, возникающие у обработчиков событий в наследуемых компонентах. Lists common issues that occur with event handlers in inherited components.

Обработка и вызов событий Handle and raising events

События в .NET основаны на модели делегата. Events in .NET are based on the delegate model. Модель делегата соответствует шаблону разработки наблюдателя, который позволяет подписчику зарегистрироваться у поставщика и получать от него уведомления. The delegate model follows the observer design pattern, which enables a subscriber to register with and receive notifications from a provider. Отправитель события отправляет уведомление о событии, а приемник событий получает уведомление и определяет ответ на него. An event sender pushes a notification that an event has happened, and an event receiver receives that notification and defines a response to it. В этом разделе описываются основные компоненты модели делегата, использование событий в приложениях и реализация событий в коде. This article describes the major components of the delegate model, how to consume events in applications, and how to implement events in your code.

Читайте также:  Размытый монитор windows 10

События Events

Событие — это сообщение, посланное объектом, чтобы сообщить о совершении действия. An event is a message sent by an object to signal the occurrence of an action. Это действие может быть вызвано пользовательским взаимодействием, например нажатием кнопки, или какой-то другой программной логикой, например изменением значения свойства. The action can be caused by user interaction, such as a button click, or it can result from some other program logic, such as changing a property’s value. Объект, вызывающий событие, называется отправителем событий. The object that raises the event is called the event sender. Отправителю событий не известен объект или метод, который будет получать (обрабатывать) созданные им события. The event sender doesn’t know which object or method will receive (handle) the events it raises. Обычно событие является членом отправителя событий; например, событие Click — член класса Button, а событие PropertyChanged — член класса, реализующего интерфейс INotifyPropertyChanged. The event is typically a member of the event sender; for example, the Click event is a member of the Button class, and the PropertyChanged event is a member of the class that implements the INotifyPropertyChanged interface.

Чтобы определить событие, необходимо использовать ключевое слово event в C# или Event в Visual Basic в сигнатуре класса события и задать тип делегата для события. To define an event, you use the C# event or the Visual Basic Event keyword in the signature of your event class, and specify the type of delegate for the event. Делегаты описаны в следующем разделе. Delegates are described in the next section.

Как правило, для вызова события добавляется метод, помеченный как protected и virtual (в C#) или Protected и Overridable (в Visual Basic). Typically, to raise an event, you add a method that is marked as protected and virtual (in C#) or Protected and Overridable (in Visual Basic). Назовите этот метод On EventName; например, OnDataReceived . Name this method On EventName; for example, OnDataReceived . Метод должен принимать один параметр, который определяет объект данных события, являющийся объектом типа EventArgs или производного типа. The method should take one parameter that specifies an event data object, which is an object of type EventArgs or a derived type. Этот метод предоставляется, чтобы производные классы могли переопределять логику для вызова события. You provide this method to enable derived classes to override the logic for raising the event. Производный класс должен вызывать метод On EventName базового класса, чтобы зарегистрированные делегаты получили событие. A derived class should always call the On EventName method of the base class to ensure that registered delegates receive the event.

В следующем примере показан способ объявления события ThresholdReached . The following example shows how to declare an event named ThresholdReached . Событие связано с делегатом EventHandler и возникает в методе OnThresholdReached . The event is associated with the EventHandler delegate and raised in a method named OnThresholdReached .

Делегаты Delegates

Делегат — это тип, содержащий ссылку на метод. A delegate is a type that holds a reference to a method. Делегат объявляется с сигнатурой, указывающей тип возвращаемого значения и параметры для методов, на которые он ссылается, и может содержать ссылки только на методы, соответствующие его сигнатуре. A delegate is declared with a signature that shows the return type and parameters for the methods it references, and it can hold references only to methods that match its signature. Таким образом, делегат эквивалентен указателю на строго типизированную функцию или обратному вызову. A delegate is thus equivalent to a type-safe function pointer or a callback. Объявления делегата достаточно для определения класса делегата. A delegate declaration is sufficient to define a delegate class.

У делегатов широкая область применения в .NET. Delegates have many uses in .NET. В контексте событий делегат — это посредник (или механизм, подобный указателю) между источником события и кодом, обрабатывающим событие. In the context of events, a delegate is an intermediary (or pointer-like mechanism) between the event source and the code that handles the event. Делегат связывается с событием за счет включения типа делегата в объявление события, как показано в примере в предыдущем разделе. You associate a delegate with an event by including the delegate type in the event declaration, as shown in the example in the previous section. Дополнительные сведения о делегатах см. в разделе, посвященном классу Delegate. For more information about delegates, see the Delegate class.

.NET предоставляет делегаты EventHandler и EventHandler для поддержки большинства сценариев событий. .NET provides the EventHandler and EventHandler delegates to support most event scenarios. Используйте делегат EventHandler для всех событий, не содержащих данных. Use the EventHandler delegate for all events that do not include event data. Используйте делегат EventHandler для событий, содержащих данные о событии. Use the EventHandler delegate for events that include data about the event. У этих делегатов нет типа возвращаемого значения. Они принимают два параметра (объект для источника события и объект для данных события). These delegates have no return type value and take two parameters (an object for the source of the event, and an object for event data).

Эти делегаты являются многоадресными, то есть в них могут храниться ссылки на несколько методов обработки событий. Delegates are multicast, which means that they can hold references to more than one event-handling method. Дополнительные сведения см. на справочной странице класса Delegate. For details, see the Delegate reference page. Делегаты позволяют гибко и точно управлять обработкой событий. Delegates provide flexibility and fine-grained control in event handling. Делегат выступает как диспетчер событий для класса, вызывающий событие за счет ведения списка зарегистрированных обработчиков для события. A delegate acts as an event dispatcher for the class that raises the event by maintaining a list of registered event handlers for the event.

Для сценариев, в которых делегаты EventHandler и EventHandler не работают, можно определить собственный делегат. For scenarios where the EventHandler and EventHandler delegates do not work, you can define a delegate. Сценарии, для которых необходимо определять собственные делегаты, очень редки. Это бывает, например, при работе с кодом, не распознающим универсальные типы. Scenarios that require you to define a delegate are very rare, such as when you must work with code that does not recognize generics. При объявлении делегат необходимо пометить ключевым словом delegate в C# или Delegate в Visual Basic. You mark a delegate with the C# delegate and Visual Basic Delegate keyword in the declaration. В следующем примере показано, как объявить делегат с именем ThresholdReachedEventHandler . The following example shows how to declare a delegate named ThresholdReachedEventHandler .

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

Данные, связанные с событием, могут быть предоставлены с помощью класса данных события. Data that is associated with an event can be provided through an event data class. .NET предоставляет множество классов данных событий, которые можно использовать в приложениях. .NET provides many event data classes that you can use in your applications. Например, класс SerialDataReceivedEventArgs — класс данных события SerialPort.DataReceived. For example, the SerialDataReceivedEventArgs class is the event data class for the SerialPort.DataReceived event. В .NET имена всех классов данных событий оканчиваются ключевым словом EventArgs . .NET follows a naming pattern of ending all event data classes with EventArgs . Определить, какой класс данных события связан с событием, можно по делегату этого события. You determine which event data class is associated with an event by looking at the delegate for the event. Например, делегат SerialDataReceivedEventHandler содержит класс SerialDataReceivedEventArgs в качестве одного из своих параметров. For example, the SerialDataReceivedEventHandler delegate includes the SerialDataReceivedEventArgs class as one of its parameters.

Читайте также:  Gopro app mac os

Класс EventArgs является базовым типом для всех классов данных событий. The EventArgs class is the base type for all event data classes. Класс EventArgs используется также, если событие не содержит связанных данных. EventArgs is also the class you use when an event does not have any data associated with it. При создании события, которое лишь уведомляет другие классы о том, что что-то произошло, и не передает никаких данных, используйте класс EventArgs в качестве второго параметра в делегате. When you create an event that is only meant to notify other classes that something happened and does not need to pass any data, include the EventArgs class as the second parameter in the delegate. Если данные не предоставляются, можно передать значение EventArgs.Empty. You can pass the EventArgs.Empty value when no data is provided. Делегат EventHandler содержит класс EventArgs в качестве параметра. The EventHandler delegate includes the EventArgs class as a parameter.

Если требуется создать пользовательский класс данных события, создайте класс, производный от класса EventArgs, а затем укажите все члены, необходимые для передачи данных, связанных с событием. When you want to create a customized event data class, create a class that derives from EventArgs, and then provide any members needed to pass data that is related to the event. В большинстве случаев следует использовать схему именования .NET и завершать имя класса данных события ключевым словом EventArgs . Typically, you should use the same naming pattern as .NET and end your event data class name with EventArgs .

В следующем примере показан класс данных события с именем ThresholdReachedEventArgs . The following example shows an event data class named ThresholdReachedEventArgs . Он содержит свойства, относящиеся только к вызываемому событию. It contains properties that are specific to the event being raised.

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

Для обработки события в приемнике события необходимо определить метод обработчика события. To respond to an event, you define an event handler method in the event receiver. Этот метод должен соответствовать сигнатуре делегата обрабатываемого события. This method must match the signature of the delegate for the event you are handling. В обработчике событий выполняются действия, необходимые при возникновении события, например сбор данных, введенных пользователем при нажатии кнопки. In the event handler, you perform the actions that are required when the event is raised, such as collecting user input after the user clicks a button. Чтобы получать уведомления при возникновении события, метод обработчика события должен быть подписан на событие. To receive notifications when the event occurs, your event handler method must subscribe to the event.

В следующем примере показан метод обработчика события c_ThresholdReached , который соответствует сигнатуре делегата EventHandler. The following example shows an event handler method named c_ThresholdReached that matches the signature for the EventHandler delegate. Метод подписывается на событие ThresholdReached . The method subscribes to the ThresholdReached event.

Обработчики статических и динамических событий Static and dynamic event handlers

.NET позволяет подписчикам регистрироваться для получения уведомлений о событиях как статически, так и динамически. .NET allows subscribers to register for event notifications either statically or dynamically. Обработчики статических событий действуют в течение всего жизненного цикла класса, события которого они обрабатывают. Static event handlers are in effect for the entire life of the class whose events they handle. Обработчики динамических событий активируются и деактивируются во время выполнения программы, обычно в ответ на определенную условную логику программы. Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. Например, они могут использоваться, если уведомления о событиях требуются только в определенных условиях, либо приложение предоставляет несколько обработчиков событий и выбор конкретного обработчика зависит от условий среды выполнения. For example, they can be used if event notifications are needed only under certain conditions or if an application provides multiple event handlers and run-time conditions define the appropriate one to use. В примере в предыдущем разделе показано, как динамически добавлять обработчик события. The example in the previous section shows how to dynamically add an event handler. Дополнительные сведения см. в разделах события (в Visual Basic) и события (в C#). For more information, see Events (in Visual Basic) and Events (in C#).

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

Если класс создает несколько событий, компилятор создает одно поле для каждого экземпляра делегата события. If your class raises multiple events, the compiler generates one field per event delegate instance. При большом количестве событий стоимость хранения одного поля на делегата может оказаться неприемлемой. If the number of events is large, the storage cost of one field per delegate may not be acceptable. Для таких случаев .NET предоставляет свойства события, которые можно использовать вместе с другой структурой данных для хранения делегатов события. For those situations, .NET provides event properties that you can use with another data structure of your choice to store event delegates.

Свойства событий состоят из объявлений событий и методов доступа к событиям. Event properties consist of event declarations accompanied by event accessors. Методы доступа к событиям — это определяемые пользователем методы, добавляющие или удаляющие экземпляры делегата события из структуры данных хранения. Event accessors are methods that you define to add or remove event delegate instances from the storage data structure. Обратите внимание, что использование свойств события снижает быстродействие по сравнению с полями события, поскольку перед вызовом каждого делегата события его необходимо извлечь. Note that event properties are slower than event fields, because each event delegate must be retrieved before it can be invoked. Необходимо найти компромисс между памятью и скоростью. The trade-off is between memory and speed. Если ваш класс определяет много событий, которые вызываются нечасто, необходимо реализовать свойства событий. If your class defines many events that are infrequently raised, you will want to implement event properties. Дополнительные сведения см. в разделе Практическое руководство. Обработка нескольких событий с помощью их свойств. For more information, see How to: Handle Multiple Events Using Event Properties.

Оцените статью