解绑绑定源

时间:2011-06-29 15:30:42

标签: c# winforms bindingsource

我在Windows窗体应用程序中使用bindingsource来填充视图中的一些文本框等。绑定工作正常但是如何从我的对象中取消订阅我的bindingSource呢?

bindingSource.DataSource = new Foo();//OK
bindingSource.DataSource = null;//Not ok

如果我尝试通过设置data = null取消绑定,我会得到一个例外:

  

System.ArgumentException:无法绑定   到酒店或酒吧栏上   数据源。参数名称:dataMember

我不想删除所有绑定到我的控件(我有很多),但只要bindingSource没有数据就想挂起绑定....

我找到了一个像bindingSource.DataSource = typeof(Foo);这样的解决方法,但这是方法吗?

3 个答案:

答案 0 :(得分:5)

“替代方法”的类型实际上是Windows表单设计器在PropertyGrid中设置BindingSource的DataSource时所执行的操作,并从“项目数据源”中选择一种类型。

查看表单的* .designer.cs文件中生成的代码。

我们在其中一个产品中使用这个“技巧”,并且它已经运作了很多年了。

此致

答案 1 :(得分:0)

我不知道BindingSource对象的.Data属性,但是有一个.DataSource属性,可以设置为null:

bindingSource.DataSource = null;

这将从数据中释放绑定源。但是,查看reference for BindingSource.DataSource

DataSource property             List results
----------------------------    -------------------------------------------
null with DataMember set        Not supported, raises ArgumentException.

如果您正在使用DataMember,则无法将DataSource设置为null而没有例外。

不幸的是,我不知道你的解决方法是否是一种正确的方法,但至少现在我们知道在设置DataMember时你不能简单地绑定到null。

答案 2 :(得分:0)

mrlucmorin给了你正确答案。它正在发挥作用,这是处理这种情况的正确方法。

但是,如果您的DataSource是DataTable类型,它将无法正常工作。在这种情况下,您可能希望在归零BindingSource.DataSource之前使用bs.RaiseListChangedEvents = false;,并在分配新的DataSource之后将其设置为true。在您将其设置为true后,请不要忘记使用bs.ResetBindings(true);

重置绑定

请注意,这可能会导致您的数据绑定控件中包含“旧”数据。