首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#删除附加到Bindingsource的ListChanged事件

C#删除附加到Bindingsource的ListChanged事件
EN

Stack Overflow用户
提问于 2018-03-18 17:16:38
回答 1查看 289关注 0票数 0

我有一个绑定源如下:

代码语言:javascript
复制
BindingSource bs = new BindingSource(dsOptions, "students");

我增加了一项活动如下:

代码语言:javascript
复制
bs.ListChanged += new ListChangedEventHandler( (object sender, ListChangedEventArgs e) =>
    {
        lblCount.Text = bs.Count.ToString();
    });

请注意,我添加了该事件,而没有将其作为以下代码行放在单独的函数中:

代码语言:javascript
复制
bs.ListChanged += new ListChangedEventHandler( listCount);

private void listCount(object sender, ListChangedEventArgs e)
        {
            lblCount.Text = bs.Count.ToString();
        }

但这不是我要找的。

在我的例子中,如何删除ListChanged事件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-18 22:26:51

您应该非常小心,因为您可以很容易地在添加处理程序不止一次,或者更糟糕的是,添加越来越多的处理程序时出现错误。这实际上不是事件处理程序的目的。通常,如果您需要禁用事件处理程序,这意味着您不应该使用事件处理程序(相反,您应该在设置包装器属性时更新文本,或者更容易禁用)。

但是你问了,所以你可以这么做:

代码语言:javascript
复制
var handler = new ListChangedEventHandler( (object sender, ListChangedEventArgs e) =>
{
    lblCount.Text = bs.Count.ToString();
});
// keep handler in a member variable so you can refer to it later.

bs.ListChanged -= handler; // remove it just in case it’s been added before; there’s no harm, even if it hasn’t already been added.
bs.ListChanged += handler;

 ...

//later remove it
bs.ListChanged -= handler; // remove it

// do your logic where you want the handler disabled.

// now add it back.
bs.ListChanged -= handler; // remove it just in case it’s been added before; there’s no harm, even if it hasn’t already been added.
bs.ListChanged += handler;

再说一次,这很容易出错。而且很难找出这个bug;没有简单的方法来检查您是否不止一次地检查+=‘d。如果您不太小心,您会意外地多次添加处理程序,这可能会使代码设置lblCount.Text多次被调用,并可能导致您的程序变得越来越慢,所以我建议您找到另一种方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49350735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档