2011-06-27 32 views
1

我想知道是否有任何方法在VB.net中结合事件。我正在使用Windows窗体,并为每个执行不同操作的按钮提供三个事件。我想用一种方法把所有三个事件都放进去,但是在做这件事时遇到了麻烦。以下是其中一个按钮的示例。为了简化问题,我删除了每个子内部的所有代码。在VB.net中结合事件

Private Sub btnRightPos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRightPos.Click 

End Sub 

Private Sub btnRightPos_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown 

End Sub 

Private Sub btnRightPos_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseUp 

End Sub 
+0

如果每个事件都不同的动作,为什么把它们放在一起,然后试着找出哪个是哪个? – dbasnett

+0

如果我可以将所有三个事件放在一个方法中,它可以简化代码,并且使代码更容易阅读,而不是在代码的不同位置使用多个方法(这是代码在给予我之前的样子,我重新排列了所有内容)。很容易判断哪个事件是哪一个,如果我可以找到一种方法将每个事件引用到方法中的局部变量,并使用case结构来执行正确的代码。这是我遇到的问题,并且想知道是否有某种方式可以以某种方式引用该事件。 – James

回答

4

MouseUpMouseDown可以说Handles btnRightPos.MouseDown, btnRightPos.MouseUp这样的组合。

Private Sub btnRightPos_MouseDownAndDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown, btnRightPos.MouseUp 

End Sub 

但Button.Click不能与其他两个组合,因为它的事件处理程序具有不同的签名。

关于重用代码的事情,可以将公共逻辑分离为一个单独的函数,只需从事件处理程序中调用该函数即可。

+0

如果你不关心参数,它**可以组合。看到我的答案。 VB.NET允许你使用无参数的方法来说“我不关心签名,为我找出来”。 – vcsjones

+1

@vcsjones我不知道,但我会认为在大多数情况下,当你有多个事件的单个处理程序时,会需要'sender'参数来做任何明智的事情。 –

1

您可以轻松地做到这一点使用

AddHandler obj.OnEvent, AddressOf MyEventHandler 

因此,例如

private Default_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) 

然后

AddHandler btnRightPos.MouseUp, AddressOf Default_MouseUp 
AddHandler btnLeftPos.MouseUp, AddressOf Default_MouseUp 
2

这要看情况。你关心这些争论吗?你需要sendere吗?你可以合并其中的两个,如果你不关心这些论点,你可以将三者结合起来。原因是Click的签名是不同的。由于上下共享相同的签名,他们可以结合这样的:

Private Sub btnRightPos_UpAndDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles btnRightPos.MouseDown, btnRightPos.MouseUp 

End Sub 

如果要合并所有三个:

Private Sub btnRightPos_All() Handles btnRightPos.Click, btnRightPos.MouseUp, btnRightPos.MouseDown 

End Sub 

VB.NET有一个有趣的功能,让这项工作,在那里您可以使用无参数方法来处理任何事件;有效地说:“我不关心签名,使其工作”。

+0

我不关心争论者。我明白你是如何声明sub的,但是我怎么区分sub中的每个事件,因为我不能在一个案例中使用这个事件,或者如果是stamenent。 – James

-2

这似乎是审慎的做法。如果一件事情有点不同,那么修复起来更容易。只是因为他们今天是相同的......

Private Sub btnRightPos_Click(sender As Object, _ 
           ByVal e As System.EventArgs) _ 
          Handles btnRightPos.Click 
    btnRightPosCommon(sender, e, "C") 
End Sub 

Private Sub btnRightPos_MouseDown(ByVal sender As System.Object, _ 
            ByVal e As System.Windows.Forms.MouseEventArgs) _ 
           Handles btnRightPos.MouseDown 
    btnRightPosCommon(sender, e, "D") 
End Sub 

Private Sub btnRightPos_MouseUp(ByVal sender As System.Object, _ 
           ByVal e As System.Windows.Forms.MouseEventArgs) _ 
          Handles btnRightPos.MouseUp 
    btnRightPosCommon(sender, e, "U") 
End Sub 

'common 
Private Sub btnRightPosCommon(ByVal sender As System.Object, _ 
           ByVal e As System.Object, Optional id As String = "") 

    Debug.WriteLine("{0} {1} {2}", sender.GetType, e.GetType, id) 
End Sub 
+0

在投票时发表评论很有礼貌。 – dbasnett

+0

尽管看起来这样做没有问题,但它通过将三个事件语句排除在单个事件语句中来挫败我试图在代码中执行的目的。这使代码更长,而不是减少它。 – James

+0

你已经说过了,“我不关心争论者,我明白你是如何声明sub的,但是我怎么区分sub中的每个事件......”所以,如果你能做到你想做的事情,那听起来像sub是如果那么elseif then语句将包含。所以是的,你可能会保存一行或两行代码,但是当下一个人出现时会发生什么,寻找Click事件的代码?如果用户双击表单上的按钮并添加生成的“New”事件处理程序的代码,会发生什么情况?也许你会再次投票给我,但你没有把事情做得更好。 – dbasnett