Vb.net 确定是否已将事件附加到

Vb.net 确定是否已将事件附加到,vb.net,events,event-handling,Vb.net,Events,Event Handling,我有两个对象——一个包含一些将触发事件的代码,另一个包含该事件的处理程序。我不能在第一个对象的加载中使用“AddHandler”,因为第二个对象的实例还不存在。当我引发事件时,我想检查object2的副本是否已实例化(易于实现),以及是否已将处理程序附加到事件(不确定如何实现) 我也愿意接受另一个关于如何做到这一点的建议。如果我在Object1.Load中执行AddHandler,而Object2还不存在,那么它将永远不会处理我的事件,即使我稍后创建它。现在,在触发事件的代码中,我只是在每次引发

我有两个对象——一个包含一些将触发事件的代码,另一个包含该事件的处理程序。我不能在第一个对象的加载中使用“AddHandler”,因为第二个对象的实例还不存在。当我引发事件时,我想检查object2的副本是否已实例化(易于实现),以及是否已将处理程序附加到事件(不确定如何实现)

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


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

如果您只想知道是否附加了任何处理程序,您应该能够检查事件是否为null

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

(我让你把它翻译成VB)

你也可以在挂接事件之前检查一个bool字段

if not eventHooked then
 addhandler
 eventHooked = true
end if

另外,如果你需要一个好的c#到vb的转换器,有一个可以动态翻译100行或更少的代码,或者免费翻译1000行的项目。不仅如此,你还必须购买它,但通常这些限制会起到很好的作用。不,我不是在为它们做广告:-)

VB.Net以
事件模式创建一个特殊的私有成员变量,然后您可以使用该变量进行测试

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

根据此处的响应:(根据我的测试,这些响应似乎有效),在调用RaiseEvent时,将检查现有事件处理程序。如果不想引发事件,只需检查是否附加了任何处理程序,则可以检查名为event的隐藏变量的值,如:

Public Event Foo As ActionFoo

If FooEvent IsNot Nothing Then...

为什么不能使用withevents?我不确定使用withevents会对我的情况产生怎样的影响-这不是事件未引发的问题,也不是处理程序工作不正常的问题-它们都很好。只是在我拥有处理事件的对象实例之前,我无法附加处理程序,所以我不确定检查该事件的最佳位置。我已经考虑过这一点,这可能就是我要做的。我只是觉得可能有一种简单的方法可以检测事件是否已经被钩住,但如果没有,那么这是我首选的方法。虽然我希望避免这种解决方案,但它解决了我的问题,效果很好。谢谢你的帮助。我是为一个自定义事件而做的,而不是标准事件,而且这段代码在这种情况下似乎不起作用-检查MyEvent的值失败语法,告诉我“这是一个事件,不能直接调用”,所以我甚至无法编译。我想这是C#处理与VB不同的东西…@ChrisF:这就是为什么我想知道他是否想知道是否附加了任何处理程序(相对于特定的处理程序)。也许他知道他是唯一会碰它的人@rwmnau:据我所知,事件只能由其声明类直接访问,因此此代码必须放入类本身。实际上,在VB.Net中,事件不能这样使用。如果EventName不是Nothing,则只会导致编译错误。实际上,在VB.Net中,Event不能这样使用。如果EventName不是空,则只会导致编译错误。