Как получить тип события в Sub, обрабатывающий несколько событий? - PullRequest
0 голосов
/ 14 апреля 2011

Я создаю программу, используя Visual Basic 2010 Express .

Я хочу создать Sub для обработки событий MouseHover и MouseLeave.Это возможно?И если возможно, чем я могу отличить событие MouseHover от события MouseLeave?

1 Ответ

2 голосов
/ 14 апреля 2011

Да , один и тот же метод может обрабатывать несколько событий, если они имеют совместимые подписи. Поскольку оба события MouseHover и MouseLeave имеют идентичные сигнатуры методов, это легко.

Под сигнатурами методов, конечно, я имею в виду передаваемые аргументы. Например, вот сигнатуры для метода, который обрабатывает оба этих события:

Sub MouseHoverHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Sub MouseLeaveHandler(ByVal sender As Object, ByVal e As System.EventArgs)

Поскольку они идентичны, один и тот же метод может обрабатывать оба события. Все, что вам нужно сделать, это добавить имена обоих событий после ключевого слова Handles, разделяя их запятой. Например:

Private Sub MegaHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover, myControl.MouseLeave


Но, увы , то, что делает , делает невозможным различие между событиями, так как для обоих будет вызван один и тот же обработчик. Это часто удобно, когда вы хотите выполнить идентичный код и не заботитесь о том, какое отдельное событие было вызвано.

Это не очень хороший вариант, когда вам нужно различать события. Но нет ничего плохого в определении нескольких методов-обработчиков событий. Это не повлияет на производительность вашего приложения.


Другой вариант, который вы могли бы рассмотреть, - это присоединение методов-заглушек в качестве обработчиков к обоим этим событиям, и заставить эти заглушки вызывать другой метод, который выполняет фактическую работу. Поскольку у каждого события будет свой отдельный обработчик, вы сможете определить, какое событие было вызвано, и передать эту информацию в качестве параметра в рабочий метод. Может быть, объяснение будет более понятным:

Private Sub MouseHoverHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover

    ' Call the method that does the actual work
    DoMouseWork(sender, e, True)    
End Sub

Private Sub MouseLeaveHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover

    ' Call the method that does the actual work
    DoMouseWork(sender, e, False)    
End Sub

Private Sub MegaMouseHandler(ByVal sender As System.Object, ByVal e As System.EventArgs, _
                             ByVal isHover As Boolean)
    ' Do the appropriate work to handle the events here.

    ' If the isHover parameter is True, the MouseHover event was raised.
    ' If the isHover parameter is False, the MouseLeave event was raised.
 End Sub

Бонусные баллы за признание того, что указание типа события лучше всего было бы реализовать, передав значение enum в метод мега-обработчика вместо логического значения. (Перечисления делают ваш исходный код гораздо более информативным; вам нужно проверить сигнатуру метода MegaMouseHandler, чтобы узнать, что представляет собой логический параметр.)

...