Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Создание обработчика для группы событий
8 февраля 2009

Можно создать метод, способный обрабатывать несколько событий. Обычно это
требуется, если несколько экземпляров класса или элементов управления генери-
руют одинаковые события. Например, если на форме расположена группа кнопок,
выполняющих сходные функции в приложении, стоит создать единственный ме-
тод, который будет обрабатывать событие Click для всех этих кнопок. Кнопку, гене-
рировавшую событие, определяют по значению параметра sender.
Связать обработчик с несколькими событиями просто: это делается при помо-
ши оператора AddHandler (в Visual Basic .NET, а в С# — +=), как и в случае с одним
событием.
Visual Basic .NET
Этот пример предполагает наличие метода ClickHandler с
сигнатурой, подходящей для приема событий Click.
AddHandler Buttonl.Click, AddressOf ClickHandler
AddHandler Button2.Click, AddressOf ClickHandler
Visual C#
// Этот пример предполагает наличие метода ClickHandler с
// сигнатурой, подходящей для приема событий Click.
buttonl. Click +- new System. EventHandler(CHckHandler);
button2.Click +- new System.EventHandler(ClickHandler);
В Visual Basic .NET для связывания одного обработчика с несколькими событи-
ям применяют конструкцию Handles, в которой перечисляют (через запятую) все
события, с которыми следует связать обработчик:
Visual Basic .NET
Private Sub ClickHandler (ByVal sender As System.Object, e As
System.EventArgs) Handles Buttonl.Click, Button2.Click,
Buttons.Click
Реализация опущена.
End Sub
События с несколькими обработчиками
У события может быть несколько обработчиков. При генерации такого события,
все обработчики исполняются в порядке их связывания с этим событием. Так, если
с событием х были поочередно связаны в коде обработчики у, z и q, то при генера-
ции этого события сначала исполняется обработчик у, затем z и в последнюю оче-
редь q. В Visual C# имеется одна особенность: если событие возвращает значение,
при наличии у него нескольких обработчиков, будет возвращен результат исполне-
ния последнего обработчика.
Чтобы связать с событием несколько обработчиков, достаточно поочередно под-
ключить их к нужному событию. В Visual Basic .NET это делается декларативно с
помощью конструкции Handles. Правда, в этом случае трудно предсказать порядок
вызова обработчиков при генерации события; если важно его знать, лучше опреде-
лить его экспериментально.
Отключение обработчиков во время выполнения
Как уже говорилось, для динамического связывания обработчика с событием при-
меняется ключевое слово AddHandler (в Visual Basic .NET) или оператор +- (в Visual
С#). Возможна и обратная операция — динамический разрыв связи между обработ-
чиком и событием во время выполнения. Рассмотрим следующий пример. Допус-
тим, имеется класс, представляющий банковский счет, который генерирует собы-
тие NotSufficientFunds всякий раз, когда владелец счета пытается выписать чек на
сумму, превышающую остаток средств на счете. С этим событием можно связать
два обработчика: метол Charge Account, вычисляющий размер сбора за предосгавле-
ние дополнительного кредита в размере суммы, на которую выписан чек, и Notify,
извещающий владельца счета о превышении кредита (об овердрафте). Метод ChargeAccount
имеет смысл вызывать каждый раз, когда проходит овердрафтный чек, а
метол Notify достаточно вызвать однажды, а когда баланс счета вновь станет поло-
жительным, можно его вызвать еще раз. Чтобы реализовать такой сценарий, следу-
ет разорвать связь между методом Notify и событием NotSufficientFunds после перво-
го вызова, и восстановить ее, когда баланс счета станет положительным.
Методика удаления связи между обработчиком и событием похожа на методику
создания такой связи. В Visual Basic. NET для отключения обработчика события от
делегата применяют ключевое слово Remove Handler, указывая адрес обработчика с
помощью оператора AddressOf. В Visual C# для динамического отключения события
от его обработчика служит оператор -=. Этот оператор требует указать ссылку на
экземпляр делегата с соответствующей сигнатурой и метод, который необходимо
отключить от события. Ниже показан пример отключения метода Display Results от
события Account. Calculation Complete:
Visual Basic .NET
RernoveHandler Account.CalculationComplete, AddressOf DisplayResults
Visual C#
Account.CalculationComplete -= new calculationDelegate(DisplayResults);
Резюме
• События — это члены классов, позволяющие им обмениваться сведениями о
важных событиях. Экземпляр класса может генерировать событие — член этого
класса, чтобы уведомить другие компоненты приложения. Событие обрабаты-
вается методами, зарегистрированными как обработчики этого события. Обра-
ботчики выполняются каждый раз, когда генерируется событие.
• Работу событий обеспечивают делегаты. При объявлении события в Visual Basic
.NET достаточно указать само событие, а в Visual C# дополнительно требуется
указать подходящий делегат, В Visual Basic .NET события генерируют при помо-
щи оператора RaiseEvent, а в Visual C# для этого необходимо обратиться к собы-
тию по имени. В Visual Basic .NET обработчики событий не способны возвра-
щать значение, а в Visual C# — могут.
• Метод, обрабатывающий событие, называется его обработчиком. Чтобы про-
граммно установить связь между обработчиком и событием, которое он обраба-
тывает, воспользуйтесь экземпляром соответствующего делегата. В Visual Basic
.NET для этого используют ключевое слово AddHandler (а для получения ссылки
на метод — оператор AddressOf). В Visual C# события связывают с делегатами
при помощи оператора +=. В Visual Basic .NET такую связь можно создать дек-
ларативно посредством конструкции Handles.
• У события бывает несколько обработчиков; и наоборот, один обработчик спосо-
бен обрабатывать несколько событий. Обработчики событий можно динамичес-
ки подключать и отключать во время выполнения.

Теги: .NET

Статьи по теме:

Настройка трассировочных переключателей
Обработка событий клавиатуры на уровне формы
Наборы
Доступ к общим членам
Ссылки на внешние библиотеки
Перебор элементов массивов и наборов
Добавление элементов управления на панель Toolbox
Реализация специальных возможностей на этапе проектирования
Конструирование меню во время разработки
Декларативная защита, основанная на ролях
Применение GDI+
Создание элементов управления
Редактор реестра
Рисование простых фигур
Карринг (currying)
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Создание обработчика для группы событий. Регион сайта: Москва и Санкт-Петербург