如何移除绑定到BindingSource的ListChanged事件?附绑定代码示例
如何移除用匿名委托绑定的ListChanged事件
这个问题其实挺常见的——用匿名委托绑定事件确实写起来简洁,但要移除的时候就会碰到麻烦,因为直接写在+=后面的匿名委托没有一个可引用的变量,每次创建的匿名委托都是独立的实例,哪怕代码逻辑完全一样,也没法用相同的lambda表达式去执行-=操作。
正确的做法:提前保存匿名委托的引用
要实现可移除,你需要先把匿名委托赋值给一个ListChangedEventHandler类型的变量,再用这个变量去绑定和移除事件:
- 声明并初始化委托变量:
// 先把匿名委托存到变量里 ListChangedEventHandler countUpdateHandler = (object sender, ListChangedEventArgs e) => { lblCount.Text = bs.Count.ToString(); };
- 使用这个变量绑定事件:
BindingSource bs = new BindingSource(dsOptions, "students"); bs.ListChanged += countUpdateHandler;
- 需要移除事件时,直接用同一个变量执行
-=:
bs.ListChanged -= countUpdateHandler;
注意点
如果已经直接写了bs.ListChanged += (sender, e) => { ... };这种没有保存引用的代码,那没有办法直接移除这个事件绑定,因为你没有办法获取到那个匿名委托的实例。这种情况下,要么接受这个事件会一直存在直到BindingSource对象被垃圾回收,要么重新创建一个新的BindingSource实例来替代当前的。
内容的提问来源于stack exchange,提问作者Hilal Al-Rajhi
相关产品推荐
相关产品推荐

