确定是否已附加事件

时间:2009-06-18 14:42:37

标签: vb.net events event-handling

我有两个对象 - 一个包含一些将触发事件的代码,另一个包含该事件的处理程序。我不能在第一个对象的Load中使用“AddHandler”,因为第二个对象的实例尚不存在。当我举起我的活动时,我想检查一下object2的副本是否已被实例化(易于操作),以及是否已经将一个处理程序附加到该事件(不知道如何执行此操作)。

我也接受另一个关于如何做到这一点的建议。如果我在Object1.Load中执行我的AddHandler,并且Object2尚不存在,那么它将永远不会处理我的事件,即使我稍后创建它也是如此。现在,在触发事件的代码中,我只是在每次引发事件时都使用了一个RemoveHandler然后是一个AddHandler,然后我知道当对象最终存在时我会附加,但我知道这个是一种糟糕的方法。

我看到一篇关于类似内容的文章(Determine list of event handlers bound to event),也许我在翻译中遗漏了一些东西,但我无法让代码在VB.NET中处理我的自定义事件。

4 个答案:

答案 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)