2011-06-27 80 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