.net 如何在处理多个事件的子系统中获取事件类型?

.net 如何在处理多个事件的子系统中获取事件类型?,.net,vb.net,mouseevent,event-handling,.net,Vb.net,Mouseevent,Event Handling,我正在使用Visual Basic 2010 Express创建一个程序 我想制作一个Sub来处理MouseHover和MouseLeave事件。这可能吗?如果可能,MouseHover事件和MouseLeave事件之间有什么区别?是的,相同的方法可以处理多个事件,只要它们具有兼容的签名。由于MouseHover和MouseLeave事件都具有相同的方法签名,因此这很容易 当然,方法签名指的是传入的参数。例如,以下是处理这两个事件的方法的签名: Sub MouseHoverHandler(ByV

我正在使用Visual Basic 2010 Express创建一个程序


我想制作一个
Sub
来处理
MouseHover
MouseLeave
事件。这可能吗?如果可能,MouseHover事件和MouseLeave事件之间有什么区别?

是的,相同的方法可以处理多个事件,只要它们具有兼容的签名。由于
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

但是,,这确实使区分事件变得不可能,因为两个事件都将调用相同的处理程序。当您希望执行相同的代码而不关心引发了哪个事件时,这通常很方便

当您需要区分事件时,这不是一个好的选择。但是定义多个事件处理程序方法绝对没有错。它不会影响应用程序的性能


您可以考虑的另一个选项是将存根方法附加为这两个事件的处理程序,并将这些存根调用到执行实际工作的另一个方法中。因为每个事件都有自己的单独处理程序,所以您可以确定引发了哪个事件,并将该信息作为参数传递给worker方法。也许一个解释会更清楚:

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

认识到指定事件类型的最佳实现方式是将枚举值传递给mega处理程序方法,而不是布尔值,这是一个额外的优点。(枚举使您的源代码更具描述性;您必须检查
MegaMouseHandler
方法的签名,以了解布尔参数表示的内容。)

如果将它们连接到同一个事件处理程序,则无法区分事件,至少在不分析调用堆栈的情况下是如此,“你真的不应该这么做。”弗雷德里克叹了口气,我怕你会这么说。。。哦,好吧。你能键入答案吗?我会把它标记为我问题的“解决方案”。是的,它很糟糕,不是吗?;-)幸运的是,当我正在吃午饭时,Cody给了你一个很好的答案。你可以使用事件处理程序的Sender参数来识别引发事件的控件。尼姆:是的,你当然可以。但这不是问题所在。
sender
参数无法识别引发的事件。