加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

以编程方式在VB.NET中添加事件处理程序(如果它不存在)

发布时间:2020-12-17 07:24:32 所属栏目:百科 来源:网络整理
导读:我正在尝试为ASP.NET网页中的几个控件使用单个事件处理程序.我想在运行时添加事件处理程序,当且仅当它不存在时.在C#中,我会写如下: if (myTextBox.OnTextChanged == null){ myTextBox.OnTextChanged += DoTextChangingValidation;} 同样,我知道我可以删除事
我正在尝试为ASP.NET网页中的几个控件使用单个事件处理程序.我想在运行时添加事件处理程序,当且仅当它不存在时.在C#中,我会写如下:

if (myTextBox.OnTextChanged == null)
{
    myTextBox.OnTextChanged += DoTextChangingValidation;
}

同样,我知道我可以删除事件处理程序,如下所示:

if (myTextBox.OnTextChanged != null)
{
    myTextBox.OnTextChanged -= DoTextChangingValidation;
}

我知道如何在Visual Basic中添加和删除事件处理程序…但是如何确定如何检查它是否已经分配?

解决方法

您无法在C#或Visual Basic中从对象外部执行此操作.一个事件基本上是两个访问者:添加和删除.如果您手动编码,它立即可见:

public event EventHandler Click
{
     add { ... }
     remove { ... }
}

这些变为add_Click(EventHandler)和remove_Click(EventHandler)方法.即使您使用默认事件实现,

public event EventHandler Click;

除了使用默认实现为您生成访问器之外,它仍然没有什么不同,默认实现使用与事件同名的私有多播委托字段来存储这些处理程序.

这意味着两件事:

>对于该类的客户,他们可以对事件做的唯一两件事是添加或删除处理程序,因为只有访问者被暴露.列出当前注册的处理程序没有访问权限
>即使您对提供字段的事件使用默认实现,该字段仍然是私有的,因此除了从同一类的方法内部之外,您无法访问它.如果您具有代码权限,则可以使用反射,但请参阅#1,了解为什么它不是一般解决方案.

这实际上是故意的.原因是:对象可能是共享的,而其他代码可能已为其事件注册了其处理程序.如果您可以访问处理程序列表,则可以自己调用它们,可能会违反合同,并以类所有者不想要的方式访问私有方法.

如果你想要这样的东西,它需要在提供事件的类中完成 – 要么编写自己的add和remove来检查dupes,要么通过属性公开private字段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读