我有两个对象 - 一个包含一些将触发事件的代码,另一个包含该事件的处理程序。我不能在第一个对象的Load中使用“AddHandler”,因为第二个对象的实例尚不存在。当我举起我的活动时,我想检查一下object2的副本是否已被实例化(易于操作),以及是否已经将一个处理程序附加到该事件(不知道如何执行此操作)。
我也接受另一个关于如何做到这一点的建议。如果我在Object1.Load中执行我的AddHandler,并且Object2尚不存在,那么它将永远不会处理我的事件,即使我稍后创建它也是如此。现在,在触发事件的代码中,我只是在每次引发事件时都使用了一个RemoveHandler然后是一个AddHandler,然后我知道当对象最终存在时我会附加,但我知道这个是一种糟糕的方法。
我看到一篇关于类似内容的文章(Determine list of event handlers bound to event),也许我在翻译中遗漏了一些东西,但我无法让代码在VB.NET中处理我的自定义事件。
答案 0 :(得分:22)
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
答案 1 :(得分:1)
你也可以在挂钩事件之前检查一个bool字段。
if not eventHooked then
addhandler
eventHooked = true
end if
此外,如果你需要一个好的c#到vb转换器http://www.tangiblesoftwaresolutions.com/有一个可以动态翻译100行或更少,或免费翻译1000行的项目。不仅如此,你必须购买它,但通常这些限制将工作得很好。不,我不是要为他们做广告: - )
答案 2 :(得分:1)
根据这里的回复:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2(根据我的测试似乎有效),在调用RaiseEvent时检查现有的事件处理程序。如果您不想引发事件并且只需要检查是否附加了任何处理程序,则可以检查名为&lt; your_event_name&gt;的事件的隐藏变量的值:
Public Event Foo As ActionFoo
If FooEvent IsNot Nothing Then...
答案 3 :(得分:0)
如果您只想知道是否附加了任何处理程序,您应该能够检查该事件是否为空。
if (MyButton.Click == null)
{
MyButton.Click += myEventHandler;
}
(我会让你把它翻译成VB)