Понимание AddHandler и передача делегатов и событий - PullRequest
3 голосов
/ 18 марта 2010

Я использую AddHandler, чтобы связать функцию с событием элемента управления, которое я динамически создаю:

Public Delegate Sub MyEventHandlerDelegate(ByVal sender As Object, ByVal e As System.EventArgs)

Public Sub BuildControl(EventHandler as System.Delegate)

         dim objMyButton as new button

         AddHandler objMyButton.Click, EventHandler

    end Sub

Этот код генерирует исключение во время выполнения, заявляющее:

Невозможно привести объект типа 'MyEventHandlerDelegate' к типу 'System.EventHandler'

Что я не понимаю в System.Delegate, хотя AddHandler принимает в качестве аргумента тип "System.Delegate"? Какого типа должен быть EventHandler для приведения к типу, который может принимать AddHandler? Спасибо за вашу помощь!

Ответы [ 2 ]

5 голосов
/ 18 марта 2010

Похоже, проблема в том, что вы смешиваете типы. Событие клика требует System.EventHandler. Ваш пользовательский делегат, хотя он имеет ту же подпись, что и System.EventHandler, не является System.EventHandler.

Итак, вам нужно изменить ваш метод на System.EventHandler вместо System.Delegate:

Public Sub BuildControl(EventHandler as System.EventHandler)
     dim objMyButton as new button
     AddHandler objMyButton.Click, EventHandler
End Sub
0 голосов
/ 18 марта 2010

Делегат, который вы передаете BuildControl, имеет тип MyEventHandlerDelegate. Не могли бы вы показать нам подпись этого делегата? Возможно, подпись вашего делегата не соответствует подписи, требуемой событием Button.Click.

...