我正在尝试为ASP.NET网页中的多个控件使用单个事件处理程序。我想在运行时添加事件处理程序,当且仅当它不存在时。在C#中,我会写如下:
if (myTextBox.OnTextChanged == null)
{
myTextBox.OnTextChanged += DoTextChangingValidation;
}
同样,我知道我可以删除事件处理程序,如下所示:
if (myTextBox.OnTextChanged != null)
{
myTextBox.OnTextChanged -= DoTextChangingValidation;
}
我知道如何在Visual Basic中添加和删除事件处理程序...但是如何确定如何检查它是否已经分配?
答案 0 :(得分:7)
您无法在C#或Visual Basic中从对象外部执行此操作。一个事件基本上是两个访问者:add
和remove
。如果您手动编码,它立即可见:
public event EventHandler Click
{
add { ... }
remove { ... }
}
这些方法成为add_Click(EventHandler)
和remove_Click(EventHandler)
方法。即使您使用默认事件实现,
public event EventHandler Click;
它仍然没有什么不同,除了使用默认实现为您生成访问器,默认实现使用与事件同名的私有多播委托字段来存储这些处理程序。
这意味着两件事:
对于班级的客户,他们可以对事件做的唯一两件事是add
或remove
处理程序,因为只有访问者被公开。列出当前注册的处理程序没有访问者
即使您对提供字段的事件使用默认实现,该字段仍然是私有的,因此除了来自同一类的方法之外,您无法访问它。如果您拥有代码权限,则可以使用反射,但请参阅#1了解为什么它不是一般解决方案。
这实际上是故意的。原因是:对象可能是共享的,而其他代码可能已为其事件注册了其处理程序。如果您可以访问处理程序列表,则可以自己调用它们,可能会违反合同,并以类所有者不想要的方式访问私有方法。
如果你想要这样的事情,它需要在提供事件的类中完成 - 要么自己编写add
和remove
来检查dupes,要么通过a公开私有字段属性。
答案 1 :(得分:3)
您无需在Visual Basic中为此方案执行检查。正常的删除语法很聪明,如果它已经消失,不会向你抛出异常。