Private system windows forms

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

Обработчик событий — это метод, привязанный к событию. An event handler is a method that is bound to an event. При возникновении события выполняется код в обработчике событий. When the event is raised, the code within the event handler is executed. Каждый обработчик событий предоставляет два параметра, которые позволяют правильно управлять событием. Each event handler provides two parameters that allow you to handle the event properly. В следующем примере показан обработчик событий для Button события элемента управления Click . The following example shows an event handler for a Button control’s Click event.

Первый параметр, sender предоставляет ссылку на объект, который вызвал событие. The first parameter, sender , provides a reference to the object that raised the event. Второй параметр, e , в приведенном выше примере, передает объект, относящийся к обрабатываемому событию. The second parameter, e , in the example above, passes an object specific to the event that is being handled. Ссылаясь на свойства объекта (и иногда его методы), можно получить такие сведения, как расположение мыши для событий мыши или данных, передаваемых в событиях перетаскивания. By referencing the object’s properties (and, sometimes, its methods), you can obtain information such as the location of the mouse for mouse events or data being transferred in drag-and-drop events.

Обычно каждое событие создает обработчик событий с другим типом объекта события для второго параметра. Typically each event produces an event handler with a different event-object type for the second parameter. Некоторые обработчики событий, например MouseDown MouseUp события и, имеют один и тот же тип объекта для второго параметра. Some event handlers, such as those for the MouseDown and MouseUp events, have the same object type for their second parameter. Для этих типов событий можно использовать один и тот же обработчик событий для обработки обоих событий. For these types of events, you can use the same event handler to handle both events.

Можно также использовать один и тот же обработчик событий для обработки одного и того же события для различных элементов управления. You can also use the same event handler to handle the same event for different controls. Например, если RadioButton в форме имеется группа элементов управления, можно создать один обработчик событий для Click события и связать событие каждого элемента управления Click с одним обработчиком событий. For example, if you have a group of RadioButton controls on a form, you could create a single event handler for the Click event and have each control’s Click event bound to the single event handler. Дополнительные сведения см. в разделе руководство. Подключение нескольких событий к одному обработчику событий в Windows Forms. For more information, see How to: Connect Multiple Events to a Single Event Handler in Windows Forms.

Application. Do Events Метод

Определение

Обрабатывает все сообщения Windows, которые в данный момент находятся в очереди сообщений. Processes all Windows messages currently in the message queue.

Примеры

В следующем примере кода демонстрируется использование DoEvents метода. The following code example demonstrates using the DoEvents method. При выполнении примера пользователь может выбрать графические файлы из OpenFileDialog . When the example runs, a user can select graphics files from an OpenFileDialog. Выбранные файлы отображаются в форме. The selected files are displayed in the form. DoEventsМетод принудительно выполняет перерисовку формы для каждого открытого графического файла. The DoEvents method forces a repaint of the form for each graphics file opened. Чтобы выполнить этот пример, вставьте следующий код в форму, содержащую PictureBox именованную PictureBox1 , OpenFileDialog именованную OpenFileDialog1 и кнопку fileButton с именем. To run this example, paste the following code in a form containing a PictureBox named PictureBox1 , an OpenFileDialog named OpenFileDialog1 , and a button named fileButton . Вызовите InitializePictureBox InitializeOpenFileDialog методы и из конструктора или Load метода формы. Call the InitializePictureBox and InitializeOpenFileDialog methods from the form’s constructor or Load method.

Читайте также:  При установке windows появляется синий экран с ошибкой

В Visual Studio при добавлении OpenFileDialog в форму с помощью операции перетаскивания необходимо изменить следующий InitializeOpenFileDialog метод, удалив строку, которая создает новый экземпляр OpenFileDialog . In Visual Studio, if you add an OpenFileDialog to your form by using a drag operation, you will have to modify the following InitializeOpenFileDialog method by removing the line that creates a new instance of OpenFileDialog.

В этом примере также требуется, Control.Click Button чтобы событие элемента управления и FileOk событие объекта OpenFileDialog были подключены к обработчикам событий, определенным в примере. The example also requires that the Control.Click event of the Button control and the FileOk event of the OpenFileDialog are connected to the event handlers defined in the example. При выполнении примера откройте диалоговое окно, нажав кнопку. When the example is running, display the dialog box by clicking the button.

Комментарии

При запуске формы Windows Forms создается новая форма, которая затем ожидает, пока события будут обработаны. When you run a Windows Form, it creates the new form, which then waits for events to handle. Каждый раз, когда форма обрабатывает событие, она обрабатывает весь код, связанный с этим событием. Each time the form handles an event, it processes all the code associated with that event. Все остальные события ожидают в очереди. All other events wait in the queue. Пока код обрабатывает событие, приложение не отвечает. While your code handles the event, your application does not respond. Например, окно не перерисовывается, если в верхней части перетаскивается другое окно. For example, the window does not repaint if another window is dragged on top.

При вызове DoEvents в коде приложение может управлять другими событиями. If you call DoEvents in your code, your application can handle the other events. Например, при наличии формы, добавляющей данные в ListBox и добавляя их DoEvents в код, форма перерисовывается при перетаскивании другого окна. For example, if you have a form that adds data to a ListBox and add DoEvents to your code, your form repaints when another window is dragged over it. Если удалить DoEvents из кода, форма не будет перерисовываться до завершения выполнения обработчика событий нажатия кнопки. If you remove DoEvents from your code, your form will not repaint until the click event handler of the button is finished executing. Дополнительные сведения об обмене сообщениями см. в разделе Ввод данных пользователем в Windows Forms. For more information on messaging, see User Input in Windows Forms.

В отличие от Visual Basic 6,0, DoEvents метод не вызывает Thread.Sleep метод. Unlike Visual Basic 6.0, the DoEvents method does not call the Thread.Sleep method.

Как правило, этот метод используется в цикле для обработки сообщений. Typically, you use this method in a loop to process messages.

Читайте также:  View from your windows

Вызов этого метода приводит к приостановке текущего потока во время обработки всех ожидающих окон сообщений. Calling this method causes the current thread to be suspended while all waiting window messages are processed. Если сообщение вызывает срабатывание события, то могут выполняться другие области кода приложения. If a message causes an event to be triggered, then other areas of your application code may execute. Это может привести к тому, что приложение будет демонстрировать непредвиденные поведения, которые трудно отладить. This can cause your application to exhibit unexpected behaviors that are difficult to debug. При выполнении операций или вычислений, которые выполняются длительное время, часто бывает предпочтительнее выполнить эти операции в новом потоке. If you perform operations or computations that take a long time, it is often preferable to perform those operations on a new thread. Дополнительные сведения об асинхронном программировании см. в разделе модель асинхронного программирования (APM). For more information about asynchronous programming, see Asynchronous Programming Model (APM).

Ответы на 7 самых частых вопросов по WinForms

Ответы на 7 самых частых вопроса по WinForms

1. Как создать вторую форму
Любая форма представляет из себя класс, унаследованный от Form.
Экземпляр главной формы создается в файле Program.cs по умолчанию.

При этом ShowDialog() блокирует главную форму, т.е. управление вернется в нее, только по закрытию второй формы, а Show() просто отображает вторую форму, т.е. будут доступны обе формы.

2. Как передать данные из одной формы в другую
Часто возникает необходимость передать данные из одной формы в другую, я придумал 7 способов, у каждого свои недостатки и достоинства.
2.1 Изменение модификатора доступа (добавлено 24 июля 2017: лучше воздержаться от применения данного способа)
В Form2 Установить модификатор доступа для контрола/поля public
В любом месте Form1

+ Самый быстрый в реализации и удобный способ
— Противоречит всем основам ООП
— Возможна передача только из более поздней формы в более раннюю
— Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы

2.2 Использование открытого свойства/метода. Способ очень похож на первый
В классе Form2 определяем свойство (или метод)

+ Противоречит не всем основам ООП
— Минусы те же

2.3 Передача данных в конструктор Form2
Изменяем конструктор Form2

+ Простой в реализации способ
+ Не нарушает ООП
— Возможна передача только из более ранней формы в более позднюю

2.4 Передача ссылки в конструктор
Изменяем конструктор Form2

+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
— Нарушает ООП

2.5 Используем свойство ‘родитель’
При создании второй формы устанавливаем владельца

+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП

2.6 Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs

+ Самый удобный способ, когда данные активно используются несколькими формами.

2.7 Использование функций обратного вызова
2.7.1 Передача метода в конструктор
Создаем в основном namespace делегат

Непонятен пункт 2.5 из «Ответы на 7 самых частых вопросов по WinForms»
Вопрос по пункту 2.5 из «Ответы на 7 самых частых вопроса по WinForms». Вот код: // в форме 1.

Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition
Ответы на 7 самых частых вопросов по Windows Forms C++/CLI Edition Эта статья является.

Читайте также:  Как подключиться по ssh через терминал mac os

Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition — свой способ передачи данных между формами
Способ с использованием макросов. Средней сложности в реализации и понимании, не знаю, нарушает ли.

Список Ваших вопросов Платону Щукину и его ответы
Данная тема будет предназначана для публикования Ваших вопросов и ответов с службой поддержки.

+ Наиболее гибкий способ передачи данных
— Сложен в реализации и понимании

3. Как получить доступ к контролу из другого потока
С элементами управления можно работать только из того потока в котором они были созданы. При обращении из другого потока будет сгенерировано исключение InvalidOperationException с текстом «Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.» (Недопустимая операция в нескольких потоках: попытка доступа к элементу управления не из того потока, в котором он был создан.). Возможные решения:

3.1 Простой и неправильный способ
Отменяем проверку, из какого потока используется контрол

Для одного раза может и сработать, но делать так крайне не рекомендуется.

3.2 Использование методов Invoke/BeginInvoke
Эти методы выполняют указанные делегаты в том потоке, в котором контрол был создан.
Invoke вызывает делегат синхронно, BeginInvoke — асинхронно.
Чтобы определить, требуется ли Invoke используйте свойство InvokeRequired.
Например, объявляем делегат

Позволю себе дополнить вопрос по связи и передаче данных двух форм, формы и класса. Подобные темы возникают очень часто, но в данном FAQ нет главного примера — использование событий, которые, как я считаю, являются самым верным способом для передачи к-либо данных.
Итак, вот участки кода. Для лучшего понимания прикрепляю архив с проектом. Имеем:
1.Главная форма, с двумя датагридами и двумя кнопками.
2.Дополнительная форма с тремя текстовыми полями и одной кнопкой.
3.Отдельный класс.
Логика работы: по нажатию на кнопку получения данных из доп.формы, открывается окно второй формы. Заполняем текстовые поля, и по нажатию кнопки форма закрывается, а данные из полей оказываются в гриде 1. По нажатию кнопки получения данных из класса создается объект класса, в конструкторе класса формируется таблица, которая при вызове метода класса передает данные в осн. форму, где они отображаются в гриде 2.
Также уточню, что передачу таблиц я выбрал для наглядности, и передавать таким способом можно все что угодно, используя приведенный шаблон
PS.В моем коде специально не использовались анонимные делегаты и лямбда, для облегчения восприятия новичками.

Код основной формы:

Вложения

FormsCommunicatoinTest.rar (51.7 Кб, 1461 просмотров)
24.08.2015, 08:37 Ответы на 7 самых частых вопросов по WinForms
Комментарий модератора
Если вы нашли неточность или опечатку, хотите что-то добавить к написанному в статье — обсуждение ведётся в отдельной теме:
https://www.cyberforum.ru/faq/thread1519017.html
Меню пользователя @ tezaurismosis
Читать блог

Найти вероятность того, что студент, выбирая ответы наугад, ответит на 10 вопросов
Машина-экзаменатор содержит 12 вопросов, на каждый из которых предлагается 4 варианта ответа.

Ответы на Комплект вопросов сертиф экз «1С:Бухгалтерия 8» ред. 1.6
У кого есть ответы на «Комплект вопросов сертифицированного экзамена по программе «1С:Бухгалтерия.

на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали, что.
на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали.

Найти два самых больших и самых маленьких элементов массива
Одномерные массивы для обычных массивов и для класса Array. Составить программу нахождения двух.

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