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

C# Delete ListChanged event attached to 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 事件?

你应该非常小心,因为你很容易在多次添加处理程序时出现错误,或者更糟的是,添加处理程序的次数越来越多。这实际上不是事件处理程序的目的。一般来说,如果你需要禁用一个事件处理程序,这意味着你不应该使用它(相反你应该做一些事情,比如在设置包装器时更新文本 属性,或者更容易禁用的东西)。

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

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-prone。而且很难找出错误;没有简单的方法可以检查你是否 += 不止一次。如果您不是很小心,您会不小心多次添加处理程序,这可能会使设置 lblCount.Text 的代码被多次调用,并可能导致您的程序变得越来越慢,所以我建议您找到另一种方式。