解除绑定的BindingSource

6

我正在我的Windows表单应用程序中使用BindingSource来填充一些文本框等视图。绑定正常工作,但是如何取消绑定源与对象之间的绑定?

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

如果我尝试通过设置data = null来解除绑定,我会收到异常:

System.ArgumentException:无法绑定到数据源上的属性或列Bar。参数名称:dataMember

我不想删除所有控件的绑定(我有很多),但希望在bindingSource没有数据的情况下暂停绑定。
我找到了一个解决方法,像这样bindingSource.DataSource = typeof(Foo);,但这是正确的方法吗?
4个回答

5

"typeof"的“解决方案”实际上是当您在PropertyGrid中设置BindingSource的DataSource并从“项目数据源”中选择类型时,Windows表单设计器执行的操作。

请查看您的窗体的*.designer.cs文件中生成的代码。

我们在我们的产品中使用这种“技巧”,多年来一直运行良好。

问候


0

我不知道 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。


0

当使用typeof作为DataSource的“empty”值时,您可以像这样进行测试:

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;
    }
}

这样,您可以以简单的方式在UI中有条件地隐藏或显示“空”消息。


0

mrlucmorin 给出了正确的答案。它是有效的,也是处理这种情况的正确方式。

然而,如果您的 DataSource 是 DataTable 类型,它可能不会完全起作用。在这种情况下,您可能需要在将 BindingSource.DataSource 设为 null 之前使用 bs.RaiseListChangedEvents = false; 进行操作,并在分配新的 DataSource 后将其设置为 true。在将其设置为 true 后,不要忘记使用 bs.ResetBindings(true); 重置绑定。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接