我在Windows窗体应用程序中使用bindingsource来填充视图中的一些文本框等。绑定工作正常但是如何从我的对象中取消订阅我的bindingSource呢?
bindingSource.DataSource = new Foo();//OK
bindingSource.DataSource = null;//Not ok
如果我尝试通过设置data = null
取消绑定,我会得到一个例外:
System.ArgumentException:无法绑定 到酒店或酒吧栏上 数据源。参数名称:dataMember
我不想删除所有绑定到我的控件(我有很多),但只要bindingSource没有数据就想挂起绑定....
我找到了一个像bindingSource.DataSource = typeof(Foo);
这样的解决方法,但这是方法吗?
答案 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);
请注意,这可能会导致您的数据绑定控件中包含“旧”数据。