2009-06-18 32 views
5

我有兩個對象 - 一個包含一些代碼將激發一個事件,另一個包含該事件的處理程序。我不能在第一個對象的Load中添加「AddHandler」,因爲第二個對象的實例尚不存在。當我提出我的事件時,我想檢查一下object2的副本是否已經實例化(容易做到),並且如果處理程序已經附加到事件(不知道如何執行此操作)。確定一個事件是否已經連接到

我也接受另一個關於如何做到這一點的建議。如果我在Object1.Load中執行AddHandler,並且Object2還不存在,那麼即使稍後創建,它也不會處理我的事件。現在,在觸發事件的代碼中,我只是在每次提出事件時都使用RemoveHandler和AddHandler,然後我知道當對象最終存在時我會附加,但我知道這一點是一個糟糕的方法。

我看到一篇關於類似文章(Determine list of event handlers bound to event)的文章,也許我在翻譯中缺少某些東西,但我無法讓代碼在VB.NET中處理我的自定義事件。

+1

你爲什麼不能使用WITHEVENTS? – chrissie1 2009-06-18 14:44:31

+0

我不知道如何使用WithEvents會影響我的情況 - 這不是一個事件沒有提出,或處理程序工作不正常 - 他們都很好。這只是我不能附加處理程序,直到我有一個將處理事件的對象的實例,所以我不確定是檢查該事件的最佳位置。 – SqlRyan 2009-06-18 15:31:37

回答

1

你也可以只是你掛鉤事件之前檢查布爾領域。

if not eventHooked then 
addhandler 
eventHooked = true 
end if 

此外,如果你需要一個好的C#中動器http://www.tangiblesoftwaresolutions.com/有一個可轉換的飛行或更低的100線,或者上傳1000線免費的項目。不僅如此,你必須購買它,但通常這些限制將工作得很好。不,我不想爲他們做廣告:-)

0

如果您只是想知道是否有任何處理程序已連接,您應該能夠檢查事件是否爲空。

if (MyButton.Click == null) 
{ 
    MyButton.Click += myEventHandler; 
} 

(我會讓你翻譯成VB)

+0

如果已經添加了其他事件,則這不起作用。 – ChrisF 2009-06-18 14:54:07

16

VB.Net以<YourEvent>Event的模式創建一個特殊的私有成員變量,然後可以使用它來對Nothing進行測試。

Public Event MyClick As EventHandler 

Private Sub OnMyClick() 
    If MyClickEvent IsNot Nothing Then 
     RaiseEvent MyClick(Me, New EventArgs()) 
    Else 
     ' No event handler has been set. 
     MsgBox("There is no event handler. That makes me sad.") 
    End If 
End Sub 

http://blogs.msdn.com/b/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

相關問題