Public Event EventHandler Click;
Делегат EventHandler определяется так:
public delegate void EventHandler(object who, EventArgs args)
Объект, который сгенерировал событие, передается в параметре who, а информация, связанная с этим событием, — в параметре args.
Для многих событий в качестве параметра argsбудет служить объект класса, выведенного из класса EventArgs. Поскольку щелчок на кнопке не требует дополнительной информации, при обработке события щелчка на кнопке не нужно беспокоиться об аргументах этого события.
Следующая программа основана на предыдущей, но с добавлением кода реакции на щелчок. При каждом щелчке на кнопке будет изменяться ее местоположение.
// listing 3
// Обработка сообщений от кнопки.
Using System;
Using System.Windows.Forms;
Using System.Drawing;
class ButtonForm : Form
{
Button MyButton = new Button(); // создание экз. кнопки
public ButtonForm() // конструктор
{
Text = "Реакция на щелчок"; // надпись на форме
MyButton.Text = "Щелкните"; // надпись на кнопке
MyButton.Location = new Point(100, 200); // коорд. кнопки
// Добавляем в список обработчик событий кнопки.
MyButton.Click += new EventHandler(MyButtonClick);
Controls.Add(MyButton); // добавляем кн. на форму
}
[STAThread]
Public static void Main()
{
ButtonForm skel = new ButtonForm();
Application.Run(skel);
}
// Обработчик для кнопки MyButton.
Protected void MyButtonClick(object who, EventArgs e)
{
if(MyButton.Top == 200)
MyButton.Location = new Point(10, 10);
Else
MyButton.Location = new Point(100, 200);
}
}
Рассмотрим код обработчика события щелчка на кнопке:
// Обработчик для кнопки MyButton.
Protected void MyButtonClick(object who, EventArgs e)
{
if(MyButton.Top == 200)
MyButton.Location = new Point(10, 10);
Else
MyButton.Location = new Point(100, 200);
}
Обработчик MyButtonClick () использует такую же сигнатуру, как и приведенный выше делегат EventHandler, а это значит, что обработчик можно добавить в цепочку обработчиков для события Click.
Обратите внимание на то, что в его определении использован модификатор типа protected. И хотя это не является обязательным требованием, такая модификация имеет смысл, поскольку обработчики событий не предназначены для вызова кодом, а используются лишь для ответа на события.
В коде обработчика координаты верхней границы кнопки определяются с помощью свойства Тор.
Следующие свойства определяются для всех элементов управления (они задают координаты верхнего левого и нижнего правого углов):
public int Top { get; set; }
public int Bottom { get; }
public int Left { get; set; }
public int Right { get; }
Обратите внимание на то, что местоположение элемента управления можно изменить с помощью свойств Тор и Left, но не свойств Bottom и Right, так как последние предназначены только для чтения. (Для изменения размера элемента управления можно использовать свойства Width и Height.)
При получении события, связанного со щелчком на кнопке, проверяется координата ее верхней границы, и, если она равна начальному значению 200, для кнопки устанавливаются новые координаты: 10, 10. В противном случае кнопка возвращается в исходное положение с координатами 100, 200. Поэтому при каждом щелчке на кнопке ее местоположение меняется.
Прежде чем обработчик MyButtonClick () сможет получать сообщения, его необходимо добавить в цепочку обработчиков событий, связанную с событием Click. Это реализуется в конструкторе класса ButtonForm с помощью такой инструкции:
MyButton.Click += new EventHandler(MyButtonClick);
После выполнения этой инструкции при каждом щелчке на кнопке и будет вызываться обработчик событий MyButtonClick ().