* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Создание обработчика для группы событий
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. • У события бывает несколько обработчиков; и наоборот, один обработчик спосо- бен обрабатывать несколько событий. Обработчики событий можно динамичес- ки подключать и отключать во время выполнения.