解除绑定绑定源
本文关键字:绑定 | 更新日期: 2023-09-27 18:00:45
我在windows窗体应用程序中使用绑定源来填充视图中的一些文本框等。绑定工作正常,但如何从我的对象中取消订阅我的bindingSource?
bindingSource.DataSource = new Foo();//OK
bindingSource.DataSource = null;//Not ok
如果我试图通过设置data = null
来解除绑定,我会得到一个异常:
System.ArgumentException:无法绑定到属性或栏DataSource。参数名称:dataMember
我不想删除所有到控件的绑定(我有很多),但只要bindingSource没有数据,我就想挂起绑定。。。。
我找到了一个类似bindingSource.DataSource = typeof(Foo);
的变通方法,但这就是方法吗?
typeof
"变通办法";当您在PropertyGrid中设置BindingSource的DataSource并从";项目数据源";。
查看表单.的*.designer.cs文件中生成的代码
我们使用这个";技巧";在我们的一款产品中,多年来一直运行良好。
问候
我不知道BindingSource对象的.Data
属性,但有一个.DataSource
属性,可以设置为null:
bindingSource.DataSource = null;
这将从数据中释放绑定源。但是,查看BindingSource.DataSource:的参考
DataSource property List results
---------------------------- -------------------------------------------
null with DataMember set Not supported, raises ArgumentException.
如果您使用的是DataMember,则不能在没有异常的情况下将DataSource设置为null。
不幸的是,我不知道你的变通方法是否正确,但至少现在我们知道,当设置DataMember时,你不能简单地绑定到null。
mrlucmorin给了您正确的答案。它正在发挥作用,这是处理这种情况的正确方式。
但是,如果您的DataSource是DataTable类型,则它不会完全起作用。在这种情况下,您可能希望在取消BindingSource.DataSource之前使用bs.RaiseListChangedEvents = false;
,并在分配新DataSource之后将其设置为true。在您将其设置为true之后,不要忘记使用bs.ResetBindings(true);
重置绑定
请注意,这可能会导致您的数据绑定控件中留下"旧"数据。
当使用typeof
作为";"空";值,可以这样测试:
private void BindingSource_DataSourceChanged(object sender, EventArgs e)
{
DataSource dataSource = ((BindingSource)sender).DataSource;
if (dataSource is Type t && t == typeof(MyModel))
{
lblEmpty.Visible = true;
pnlDetails.Visible = false;
}
else
{
lblEmpty.Visible = false;
pnlDetails.Visible = true;
}
}
通过这种方式,您可以有条件地隐藏或显示";"空";消息。