Читать онлайн книгу «C# для профессионалов. Том II».
Параметр
sender
предоставляет ссылку на элемент управления, который порождает событие. Чтобы добраться до свойства
DynamicId
, необходимо преобразовать его в тип
DynamicButton
. Параметр е определяет некоторые специальные аргументы события. Мы не собираемся это здесь рассматривать, но для некоторых событий в данных аргументах содержится дополнительная информация о том, что вызывает событие. Вот обработчик нажатия кнопки:
// DynamicButton_Click ...
protected void DynamicButton_Click(object sender, System.EventArgs e) {
// преобразовать sender в button ...
DynamicButton button = (DynamicButton)sender;
// msgbox ...
AddToLog("Clicked" + button.DynamicId);
}
В этом методе нет ничего необычного. Соединим его с событием Click нашей динамической кнопки. Непосредственно перед тем как вызывать
Controls.Add
, можно добавить обработчик:
// соединить обработчик ...
newButton.Click += new System.EventHandler(this.DynamicButton_Click);
// добавить кнопку к форме ...
this.Controls.Add(newButton);
Теперь, когда возникает связанное с кнопкой событие
Click
, рабочая среда Framework просматривает список делегированных методов, соединенных с этим событием, инициируя каждый из них по очереди.
Важная деталь — в .NET события могут иметь более одного обработчика. Это означает, что если создать другой делегированный метод, соединить его с помощью нового экземпляра
System.EventHandler
, то оба метода будут вызываться в момент порождения события. Конечно, методы не вызываются одновременно, так как фактически получится мультипоточное приложение, а это не то, что хотелось бы случайно получить.
Мы не определили, как выглядит наша функция
AddToLog
,— сделаем это сейчас:
// AddToLog — обновляет представление журнала ...
private void AddToLog(String buf) {
// обновляет элемент управления журнала ...
txtLog.Text = (buf + "\r\n" + txtLog.Text);
}
Теперь давайте попробуем выполнить приложение и понажимать на кнопки:
Другие обработчики
Обработчики, которые отвечают на другие события в
DynamicButton
, могут быть добавлены аналогичным образом. Прежде всего для каждого из них создается метод:
// DynamicButton_Enter ...
protected void DynamicButton_Enter(object sender, System.EventArgs e) {
// преобразовать sender в button ...
DynamicButton button = (DynamicButton)sender;
// msgbox ...
AddToLog("Enter " + button.DynamicId);
}
// DynamicButton_Leave ...
protected void DynamicButton_Leave(object sender, System.EventArgs e) {
// преобразовать sender в button ...
DynamicButton button = (DynamicButton)sender;
// msgbox ...
AddToLog("Left " + button.DynamicId);
}
Затем можно добавить обработчики для каждого из них:
// соединить обработчик
newButton.Click +=
new System.EventHandler(this.DynamicButton_Click);
newButton.MouseEnter +=
new System.EventHandler(this.DynamicButton_Enter);
newButton.MouseLeave +=
new System.EventHandler(this.DynamicButton_Leave);
Теперь, если снова выполнить приложение, в журнал будут добавляться сообщения по мере перемещения по кнопкам.
Разобрав пример создания динамических элементов управления, давайте посмотрим, как эта техника может использоваться в приложениях.
Динамические элементы управления можно использовать для настройки интерфейса пользователя приложения в зависимости от некоторых данных среды выполнения. Классическим примером этого является добавление новых возможностей в панель инструментов, когда в каталог приложения вносятся новые дополнительные средства (plug-ins) или модули. Например, установка Adobe Acrobat на компьютере может автоматически добавлять в панель инструментов Word кнопку для создания документа Acrobat.