我正在使用Visual Basic 2010 Express創建一個程序。如何獲取Sub中的事件類型處理多個事件?
我想使Sub
同時處理MouseHover
和MouseLeave
事件。這可能嗎?如果可能,我如何區分MouseHover事件和MouseLeave事件?
我正在使用Visual Basic 2010 Express創建一個程序。如何獲取Sub中的事件類型處理多個事件?
我想使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
但是,唉,即不使它不可能發生的事件區分,因爲相同的處理器將被調用兩種。當你想執行相同的代碼並且不關心引發哪個單獨的事件時,這通常是方便的。
當您需要區分事件時,這不是一個好選擇。但是定義多個事件處理函數方法絕對沒有錯。它不會影響你的應用程序的性能。
你可以考慮是否附着存根方法的處理程序這兩個事件,並讓這些存根叫喚,做實際工作的另一種方法的另一種選擇。由於每個事件都有自己的單獨處理程序,因此您將能夠確定引發了哪個事件,並將該信息作爲參數傳遞給您的工作方法。也許解釋會更清楚:
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
積分爲認識到指定事件的類型將傳遞一個枚舉值的大型處理方法來實現最好的,而不是一個布爾值。 (枚舉使您的源代碼更具描述性;您必須檢查MegaMouseHandler
方法的簽名以瞭解布爾參數代表什麼。)
謝謝你非常明確的答案:) – pepoluan 2011-04-14 10:23:25
你可以使用**發件人**參數給事件處理程序來確定哪個控件引發了事件。這就是爲什麼它在那裏。 – 2011-04-14 11:10:34
@Nims:是的,你當然可以。但這不是問題所在。 'sender'參數不能識別出哪個*事件被引發。 – 2011-04-14 11:12:16
如果將它們掛接到相同的事件處理程序,則不能區分事件,至少不是沒有訴諸分析調用堆棧等,你真的不應該這樣做。 – 2011-04-14 10:01:48
@Fredrik *嘆*,我擔心你會這麼說...哦。你可以輸入答案嗎?我將其標記爲解決方案,以我的問題。 – pepoluan 2011-04-14 10:10:52
是的,它很爛,不是嗎? ;-)幸運的是,在我吃午飯的時候,科迪給了你一個很好的答案。 – 2011-04-14 11:15:09