2009-06-18 51 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

相关问题