Как получить название события в vb.net? - PullRequest
3 голосов
/ 23 мая 2011

Здесь есть две обработчики в конкретной процедуре, затем, как узнать, какой обработчик событий выполнил.

, например,

Private Sub TextBox1_Events(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TextBox1.TextChanged, TextBox1.GotFocus

End Sub

, как получить, какое событие произошло.

Ответы [ 4 ]

3 голосов
/ 23 мая 2011

Это возможно с помощью StackTrace (может быть, лучше, я не уверен ...). Попробуйте следующий код.

 Private Sub TextBox1_Events(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox1.GotFocus

        Dim s As New StackTrace(True)

        For Each f As StackFrame In s.GetFrames
            Debug.WriteLine(f.GetMethod.Name)
        Next

    End Sub

Когда текстовое поле получает фокус, пишется следующее:

TextBox1_Events

OnGotFocus

OnGotFocus

WmSetFocus

Ect .......

Где, когда это событие изменило текст

TextBox1_Events

OnTextChanged

OnTextChanged

Ect ....

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

2 голосов
/ 23 мая 2011

В этом случае вы не можете.

  • Если события были связаны с двумя отдельными элементами управления, вы можете проверить свойство sender для типа
  • Если аргумент e для события имел некоторый тип, отличный от EventArgs (некоторые события используют другой тип аргументов), или элемент управления передал некоторый тип , полученный из EventArgs, то вы может быть в состоянии проверить свойства этой переменной

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

С этими двумя событиями они будут отправлены из одного и того же текстового поля, поэтому первый вариант отсутствует. Кроме того, с обоими событиями они отправляют просто экземпляр класса EventArgs (не производный класс), так что эта опция отсутствует.

В конечном итоге вам потребуется несколько обработчиков событий для решения этой конкретной проблемы.

1 голос
/ 23 мая 2011

Поскольку вы имеете дело с 2 событиями (похожими по сигнатуре), испускаемыми одним и тем же элементом управления, самый простой / чистый способ решения этой проблемы - это два отдельных обработчика событий (согласно предложению Мерлина Моргана-Грэма):

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TextBox1.TextChanged
        'the TextChanged specific code would go here
        HandletTextBox1EventInternal(sender, e)
    End Sub 

    Private Sub TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)     Handles TextBox1.GotFocus
        'the GotFocus specific code would go here
        HandletTextBox1EventInternal(sender, e)
    End Sub

    Private Sub HandleTextBox1EventInternal(ByVal sender As System.Object, ByVal e As System.EventArgs)
            'code common to GotFocus and TextChanged handlers
    End sub
1 голос
/ 23 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...