我有一个绑定源如下:
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();
}
但这不是我要找的。 p>
如何在我的情况下删除ListChanged事件?
答案 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被多次调用,并可能导致程序逐渐变慢,所以我建议找另一种方法