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


* При перепечатке материалов ссылка на 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

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

Свойства Font, Cursor и BackGroundlmage
Обзор ADO.NET
Применение переменных ссылочных типов
Реализация полиморфизма через наследование
Реализация свойств
Развертывание проекта
Использование провайдеров дополнительных свойств
Общеязыковая исполняющая среда
Циклические ссылки
Типы данных .NET Framework
Модель защиты, основанная на ролях
Parsing Expression Grammar Support for C# 3.0 Part 1 – PEG Lib and Parser Generator
Реализация специальных возможностей на этапе проектирования
Создание дополнительных типов объектов Doughnut
Создание абстрактных членов
| .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 | Создание обработчика для группы событий. Регион сайта: Москва и Санкт-Петербург