Последнее обновление: 31.10.2015
Для взаимодействия с пользователем в Windows Forms используется механизм событий. События в Windows Forms представляют стандартные события на C#, только
применяемые к визуальным компонентам и подчиняются тем же правилам, что события в C#. Но создание обработчиков событий в Windows Forms все же
имеет некоторые особенности.
Прежде всего в WinForms есть некоторый стандартный набор событий, который по большей части имеется у всех визуальных компонентов. Отдельные элементы
добавляют свои события, но принципы работы с ними будут похожие. Чтобы посмотреть все события элемента, нам надо выбрать этот элемент в
поле графического дизайнера и перейти к вкладке событий на панели форм. Например, события формы:
Чтобы добавить обработчик, можно просто два раза нажать по пустому полю рядом с названием события, и после этого Visual Studio
автоматически сгенерирует обработчик события. Например, нажмем для создания обработчика для события Load
:
И в этом поле отобразится название метода обработчика события Load. По умолчанию он называется Form1_Load
.
Если мы перейдем в файл кода формы Form1.cs, то увидим автосгенерированный метод Form1_Load:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } }
И при каждой загрузке формы будет срабатывать код в обработчике Form1_Load.
Как правило, большинство обработчиков различных визуальных компонентов имеют два параметра: sender
— объект, инициировавший событие,
и аргумент, хранящий информацию о событии (в данном случае EventArgs e
).
Но это только обработчик. Добавление же обработчика, созданного таким образом, производится в файле Form1.Designer.cs:
namespace HelloApp { partial class Form1 { private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { this.SuspendLayout(); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Name = "Form1"; // добавление обработчика this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } } }
Для добавления обработчика используется стандартный синтаксис C#: this.Load += new System.EventHandler(this.Form1_Load)
Поэтому если мы захотим удалить созданный подобным образом обработчик, то нам надо не только удалить метод из кода формы в Form1.cs, но и
удалить добавление обработчика в этом файле.
Однако мы можем добавлять обработчики событий и програмно, например, в конструкторе формы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += LoadEvent; } private void Form1_Load(object sender, EventArgs e) { } private void LoadEvent(object sender, EventArgs e) { this.BackColor = Color.Yellow; } } }
Кроме ранее созданного обработчика Form1_Load здесь также добавлен другой обработчик загрузки формы: this.Load += LoadEvent;
, который
устанавливает в качестве фона желтый цвет.
I have a TextBox
on a WinForm and I want to execute some code every time someone presses a key inside of that TextBox. I’m looking at the events properties menu, and see the KeyDown
event, but don’t know how to add code to it.
pb2q
58.8k19 gold badges147 silver badges148 bronze badges
asked May 28, 2010 at 13:27
You need to add an event handler for that event. So in the properties menu, double-click on the field beside the KeyDown event and Visual Studio will create an event handler for you. It’ll look something like this:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
// enter your code here
}
You can also subscribe to events yourself without using the Properties window. For example, in the form’s constructor:
textBox1.KeyDown += HandleTextBoxKeyDownEvent;
And then implement the event handler:
private void HandleTextBoxKeyDownEvent(object sender, KeyEventArgs e)
{
// enter your code here
}
answered May 28, 2010 at 13:32
Adam Lear♦Adam Lear
38.2k12 gold badges81 silver badges101 bronze badges
1
These answers will have visual studio generate the event and bind it behind the scenes in the Designer.cs file.
If you want to know how to bind events yourself, it looks like this.
MyTextBox.KeyDown += new KeyEventHandler(MyKeyDownFunction)
private function MyKeyDownFunction(object sender, KeyEventArgs e) {
// your code
}
If done this way, the new KeyEventHandler()
part is optional. You can also use lambdas to avoid boilerplate code.
MyTextBox.KeyDown += (s, e) => {
// s is the sender object, e is the args
}
answered May 28, 2010 at 13:33
TesserexTesserex
17.2k5 gold badges67 silver badges106 bronze badges
1
Doubleclick the textfield next to it.
answered May 28, 2010 at 13:30
FemarefFemaref
60.8k7 gold badges138 silver badges176 bronze badges
I assume you are in Visual Studio. One way would be to double click on the empty textbox on the right of the KeyDown event: VS will generate the code for you.
answered May 28, 2010 at 13:30
GadGad
41.6k13 gold badges55 silver badges78 bronze badges
You need to add a handler to the event.
Double-click the KeyPress
event in the textbox’s Properties window to make Visual Studio generate an event handler in the code file.
You can then put any code you want to inside the event handler function. You can check which key was pressed by writing e.KeyCode
.
answered May 28, 2010 at 13:29
SLaksSLaks
870k177 gold badges1910 silver badges1967 bronze badges
В платформе .NET, как и в Win32, для информирования о возникновении какого-либо состояния или о действии используются события, или иногда их еще называют сообщения (по-английски: events). Например, в ответ на изменение положения окна оно генерирует событие определенного класса, которое мы можем перехватить.
Для того чтобы перехватить событие, нужно создать его обработчик. Обработчик события по сути является методом, который регистрируется на отлов определенного события от определенного элемента управления/формы/компонента. Когда
наступит событие, то этот самый элемент управления/форма/компонент вызовет метод, в котором мы можем написать код реакции на событие.
С помощью визуального дизайнера Visual Studio создание обработчиков событий превращается в тривиальную задачу. На рис. 5.8 показана панель Properties в режиме просмотра событий. Чтобы увидеть что-то подобное, нужно выделить компонент, событие которого вы хотите поймать, и нажать кнопку Events в панели Properties (на рис. 5.8 эта кнопка обведена кружком). Чтобы вернуться обратно к просмотру свойств, надо щелкнуть по кнопке Properties, которая находится левее.
Рис. 5.8. Панель Properties
при просмотре событий
Теперь, чтобы создать нужный обработчик события, достаточно щелкнуть двойным щелчком в поле справа от имени события. Среда разработки создаст необходимое событие, добавит его регистрацию в своем методе InitializeComponent(), переключится в режим кода и установит курсор в тело метода, созданного для обработки события.
Давайте создадим обработчик события MouseClick. Выделите форму, перейдите
в панели Properties в режим просмотра событий Events и щелкните двойным щелчком напротив события. Будет создан метод Form1_MouseClick():
private void Form1_MouseClick(object sender, MouseEventArgs e) { MessageBox.Show("Клик"); }
Я здесь добавил внутрь метода обработки события вызов статического метода Show() класса MessageBox. Этот метод отображает на рабочем столе диалоговое окно с сообщением, которое вы передали в качестве параметра. В нашем случае каждый раз, когда вы щелкнете по форме, будет появляться сообщение: Клик.
Очень интересным является вопрос о том, какие события получает форма, когда появляется и уничтожается. При загрузке формы генерируются следующие события и именно в такой последовательности:
- Load — загрузка;
- Activate — активация;
- VisibleChanged — изменилось свойство Visible.
- А при закрытии формы генерируются следующие события:
- Deactivated — деактивировано;
- Closing — закрытие формы (можно отменить закрытие);
- Close — форма закрыта, и назад дороги нет.
Событие Load генерируется, когда вы впервые вызываете метод Show() для отображения формы. Посмотрим на следующий пример:
MyForm form = new MyForm(); form.Show(); // отобразить форму form.Hide(); // спрятать с помощью Hide() form.Show(); // Отобразить снова
Событие Load будет сгенерировано только при первом вызове метода Show(), потому что в этот момент начнет происходить загрузка формы. Когда мы вызываем метод Hide(), то форма остается загруженной, просто прячется с экрана. Следующий вызов метода Show() только изменяет видимость окна, а загрузки не произойдет, поэтому и событие Load больше генерироваться не станет.
Очень часто у вас будут возникать казусы со случайным созданием событий. Например, если щелкнуть двойным щелчком по компоненту в визуальном дизайнере, то будет создан обработчик события по умолчанию для этого компонента. Так, для кнопки событием по умолчанию является Click, и если вы случайно щелкнете двойным щелчком по компоненту в визуальном дизайнере, то будет создан такой обработчик события. А если вы не хотели его создавать? Оставлять заготовку
метода в коде? Наверное, лучше, все же, убрать обработчик события, чтобы он не мешал. Как это сделать?
Существует несколько вариантов:
- Выделите компонент в визуальном дизайнере и перейдите в режим Events в панели свойств. Напротив события удалите в поле название метода, созданного для обработчика события. Визуальный редактор удалит регистрацию события, которую он автоматически добавил в свой метод InitializeComponent(). Если
в обработчике события не было кода, то заготовка для метода исчезнет и из кода. - Если обработчик события содержит код, но он уже не нужен, то можно сначала удалить код из обработчика события, а потом выполнить действия из предыдущего пункта.
- Если обработчик события содержит код, то можно сначала удалить имя обработчика события в режиме Events панели свойств, а потом безболезненно удалить код метода.
Если вы создали обработчик события и тут же удалили метод в редакторе кода,
то при этом среда разработки не удалит регистрацию события в методе InitializeComponent(). Это придется делать вручную. Как это сделать безболезненно? Давайте посмотрим на примере.
Создайте новое приложение и поместите на его форму кнопку. Щелкните по кнопке двойным щелчком, и среда разработки переключит вас в редактор кода с созданным для обработки события методом:
private void button1_Click(object sender, EventArgs e) { }
Удалите эту заготовку кода из редактора и попробуйте скомпилировать проект. Внизу окна появится сообщение об ошибке (рис. 5.9). В этой ошибке компилятор сообщает нам, что обработчик события не найден. Щелкните двойным щелчком по ошибке, и откроется вкладка с файлом (Form1.Designer.cs), где найдена ошибка, и
будет выделена строка кода, которую добавил визуальный редактор для регистрации события. События — это отдельная тема, которая будет рассмотрена в главе 10. А сейчас нужно только понимать, что для того, чтобы избавиться от ошибки, нужно удалить строку, которую выделил нам редактор. Так вы вручную удалите регистрацию, и проект откомпилируется без проблем.
Рис. 5.9. Сообщение об ошибке, что обработчик события не найден
Это бесплатная глава книги Библия C#. В новом издании эта глава переписана с учетом универсальных при-ложений Windows, а старая версия главы, которая не потеряла еще своей актуаль-ности стала бесплатной и доступной всем.
Все исходные коды главы 5 Библии C#
GUI
управляется событиями. Приложение
выполняет действия в ответ на события,
вызванные пользователем, например, на
щелчок кнопкой мыши или выбор пункта
меню. В Windows Forms применяется модель
обработки событий .NET, в которой делегаты
используются для того, чтобы связать
события с обрабатывающими их методами.
В классах Windows Forms используются групповые
делегаты. Групповой
делегат содержит список связанных с
ним методов.
Когда в приложении происходит событие,
управляющий элемент возбуждает событие,
вызвав делегат для этого события, который
вызывает связанные с ним методы. Для
того чтобы добавить делегат к событию
используется перегруженный оператор
+=.
Например:
this.MouseClick
+= new
MouseEventHandler(this.Form1_MouseClick);
Объявление
обработчика для этого события:
private
void Form1_MouseClick(object sender, MouseEventArgs e)
{
}
В
качестве параметра обработчик событий
получает объект класса МоuseEventArgs
(производный от класса EventArgs). Свойства
этого объекта содержат информацию,
связанную с данным событием.
-
Button
(Кнопка) определяет, какая кнопка была
нажата, -
Clicks
(Щелчки) определяет, сколько раз была
нажата и отпущена кнопка, -
Свойство
Delta (Дельта) является счетчиком оборотов
колесика мыши; -
X
и Y — координаты точки, в которой
находился указатель в момент нажатия
кнопки мыши
Внесем
изменения в FirstForm,
чтобы при щелчке кнопкой мыши строка с
приветствием перемещалась на место
щелчка.
Программа
1: Отображает
перемещение приветствия по щелчку мыши.
public
partial class Form1 : Form {
float
x, y; // координаты
Brush
pStdBrush; //
Кисть
Graphics
poGraphics;
public
Form1() {
InitializeComponent();
x=10;
y=20;
pStdBrush
= new SolidBrush(Color.Black);
poGraphics
= this.CreateGraphics();
this.Text
= «Программа
1»;
this.Show();
poGraphics.DrawString(«Hello,
Window Forms», this.Font, pStdBrush, x, y);
}
private
void Form1_MouseClick(object sender, MouseEventArgs e) {
//
координаты
точки
щелчка
мыши
x
= (float)e.X;
y
= (float)e.Y;
poGraphics.DrawString(«Hello,
Window Forms», this.Font, pStdBrush, x, y);
}
}
Параметры
метода
DrawString:
-
выводимая
строка; -
шрифт
(Font— свойство класса Form, которое
определяет шрифт, по умолчанию применяемый
для вывода текста в форму); -
используемая
кисть; -
координаты
в пикселях.
Метод
Form1_MouseClick
устанавливает координаты текста, х и
у, равными координатам точки, в которой
находился указатель в момент щелчка.
Несколько
обработчиков для события. Реализуем
два обработчика события MouseClick.
Второй обработчик по щелчку кнопкой
мыши просто отображает окно сообщения.
Метод ShowClick
подключается к событию в ручную аналогично
методу Form1_MouseClick
в файле Form1.Designer.cs.
Программа
2: Два
обработчика событий для MouseClick
public
partial
class
Form1
: Form
{
.
. .
private
void Form1_MouseClick(object sender, MouseEventArgs e) {
x
= (float)e.X; y = (float)e.Y;
poGraphics.DrawString(«Hello,
Window Forms», this.Font, pStdBrush, x, y);
}
void
ShowClick (object pSender, MouseEventArgs e)
MessageBox.Show(«Mouse
clicked!!'»);
}
Введем
в пример обработку события KeyPress, а также
покажем, как в событии MouseDown различать,
какая кнопка была нажата, левая или
правая (программа
3).
Обработка
событий от правой и левой кнопкои мыши.
Для того
чтобы определить, какая кнопка мыши
была нажата используем свойство Button
параметра MouseEventArgs. Перепишем методы
обработчика событий:
private
void Form1_MouseClick(object sender, MouseEventArgs e) {
//
если
левая
кнопка
if
(e.Button == System.Windows.Forms.MouseButtons.Left) {
x
= (float)e.X; y = (float)e.Y;
poGraphics.DrawString(«Hello,
Window Forms», this.Font, pStdBrush, x, y);
}
}
void
ShowClick (object pSender, MouseEventArgs e) {
//
если
правая
кнопка
if
(e.Button == System.Windows.Forms.MouseButtons.Right)
MessageBox.Show(«Mouse
clicked!!'»);
}
Событие
Keypress. При
нажатии пользователем на клавишу, в
конец строки приветствия будет добавлен
соответствующий символ. Вместо класса
String используется класс StringBuilder, который
более эффективен в этой ситуации.
public
partial class Form1 : Form {
StringBuilder
pStr;
String
s;
public
Form1() {
.
. .
pStr
= new StringBuilder(«Hello, Window Forms»);
s
= pStr.ToString();
poGraphics.DrawString(s,
this.Font, pStdBrush, x, y);
}
private
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
pStr.Append(e.KeyChar); // Добавляем
в
конец
s
= pStr.ToString();
poGraphics.DrawString(s,
this.Font, pStdBrush, x, y);
}
}
Программа
4: Создадим
шуточную программу, представляющую
собой диалоговое окно с двумя кнопками.
Назовем его SocOpros. Из окна Toolbox перетаскиваем
на форму две кнопки Button и надпись Label и
устанавливаем следующие свойства
элементов управления и формы (табл.
3.4):
Таблица
3.4
— Описание формы приложения
Форма, |
Значение |
FormBorderStyle |
Fixed3D |
Icon |
|
Text |
Социологический |
Label1, |
Значение |
Bold |
True |
Text |
Вы |
Button1, |
Значение |
Name |
Btnyes |
Text |
Да |
Button2, |
Значение |
Name |
Btnno |
Text |
Нет |
Щелкаем
дважды по кнопке «Да». В обработчике
этой кнопки вставляем следующий код:
void
btnyes_Click(object sender, EventArgs
e){
MessageBox.Show(«Мы
и не сомневались, что Вы так думаете!»);
}
Выделяем
кнопку «Нет». Открываем окно
Properties. Переключаемся в окно событий и
дважды щелкаем в поле MouseMove.
В
обработчике связываем движение мыши с
координатами кнопки и устанавливаем
координаты, куда она будет возвращаться,
если во время своего движения выйдет
за указанную область:
private
void Btnno_MouseMove(object sender, MouseEventArgs e) {
Btnno.Top -= e.Y; Btnno.Left += e.X;
if
(Btnno.Top < -10 || Btnno.Top > 100) Btnno.Top = 60;
if
(Btnno.Left < -80 || Btnno.Left > 250) Btnno.Left = 120;
}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Обработчик событий — это процедура в коде, определяющая, какие действия должны выполняться при возникновении тех или иных событий, например, если пользователь нажимает кнопку или сообщение поступает в очередь. При порождении события запускается получивший его обработчик или несколько обработчиков. События могут назначаться сразу нескольким обработчикам, а методы, которые управляют конкретными событиями, можно изменять динамически. Для создания обработчиков событий можно также использовать Конструктор Windows Forms.
В этом разделе
Общие сведения о событиях
Объясняет модель событий и роли делегатов.
Общие сведения об обработчиках событий
Описывает порядок обработки событий.
Практическое руководство. Создание обработчиков событий во время выполнения для форм Windows Forms
Динамически выдает инструкции по реагированию на системные или пользовательские события.
Практическое руководство. Подключение нескольких событий к одному обработчику в Windows Forms
Выдает инструкции по назначению одной и той же функциональности нескольким элементам управления с помощью событий.
Порядок событий в формах Windows Forms
Описывает порядок порождения событий в элементах управления Windows Forms.
Практическое руководство. Создание обработчиков событий с помощью конструктора
Описывает использование Конструктора Windows Forms для создания обработчиков событий.
События
Содержит ссылки на разделы по обработке и порождению событий с помощью .NET Framework.
Устранение неполадок, связанных с унаследованными обработчиками событий, в Visual Basic
Представляет распространенные проблемы, возникающие у обработчиков событий в наследуемых компонентах.