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

时间:2018-03-18 17:16:38

标签: c# function events bindingsource

我有一个绑定源如下:

BindingSource bs = new BindingSource(dsOptions, "students");

我已按如下方式添加了一个事件:

bs.ListChanged += new ListChangedEventHandler( (object sender, ListChangedEventArgs e) =>
    {
        lblCount.Text = bs.Count.ToString();
    });

请注意,我已将事件添加到单独的函数中,而不是以下代码行:

bs.ListChanged += new ListChangedEventHandler( listCount);

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

但这不是我要找的。

如何在我的情况下删除ListChanged事件?

1 个答案:

答案 0 :(得分:0)

你应该对此非常小心,因为你很容易出现错误,你不止一次添加处理程序,或者更糟糕的是,越来越多的时候。这实际上并不是事件处理程序的用途。通常,如果您需要禁用事件处理程序,则意味着您不应该使用它(相反,您应该执行类似的操作,例如在设置包装器属性时更新Text,或者更容易禁用的内容)。

但是你问道;所以你可以这样做:

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;

同样,这很容易出错。并且很难找出错误;没有简单的方法可以检查你是否多次+ ='d。如果你不是很小心,你会不小心添加处理程序多次,这可能会使代码设置lblCount.Text被多次调用,并可能导致程序逐渐变慢,所以我建议找另一种方法