如何在vb.net中获取事件名称?

时间:2011-05-23 02:48:49

标签: vb.net

这里有一个特定过程中的两个处理程序,然后是如何获取已执行的事件处理程序。

例如

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

End Sub

如何获取发生的事件。

4 个答案:

答案 0 :(得分:3)

可以使用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

     

等...

我确信你可以用这个写东西来做你需要的东西。但我完全同意其他人不同的处理程序更好。

答案 1 :(得分:2)

在这种情况下,你不能。

  • 如果事件绑定到两个单独的控件,您可以检查类型的sender属性
  • 如果事件的e参数有某种类型而不是EventArgs(某些事件使用不同的参数类型),或者控件从{传递了某种类型派生的 {1}},然后您可以检查该变量的属性

没有任何其他技巧可以使用,因为事件不会向处理程序提供任何类型的数据,指定发生了事件。

有了这两个事件,它们都将从同一个文本框发送,所以第一个选项就出来了。此外,对于这两个事件,他们只发送 EventArgs类的实例(不是派生类),因此该选项已经用完。

最终,您将需要多个事件处理程序来解决此特定问题。

答案 2 :(得分:1)

这是不可能的。如果您需要知道发生了哪个事件,那么使用两个独立的处理程序总会更好。

答案 3 :(得分:1)

由于您正在处理由同一控件发出的2个事件(签名相似),因此最简单/最干净的解决方法是2个独立的事件处理程序(如Merlyn Morgan-Graham所建议):

    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