BindingSource - 使用BindingSource的优点是什么?

21

使用类似这样的东西给我带来了什么:

DataGridView dgvDocuments = new DataGridView();
BindingSource bindingSource = new BindingSource();
DataTable dtDocuments;

dtDocuments = MsSQL.GetDocuments(dtpOd.Value, dtpDo.Value);
bindingSource.DataSource = dtDocuments;
dgvDocuments.DataSource = bindingSource;

不要这样做:

DataGridView dgvDocuments = new DataGridView();
DataTable dtDocuments;

dtDocuments = MsSQL.GetDocuments(dtpOd.Value, dtpDo.Value);
dgvDocuments.DataSource = dtDocuments;
2个回答

13

BindingSource 有很多好处,以下是其中一些:

1)当您使用 bindingsource 将数据绑定到任何控件时,它将在两侧生效。对数据源所做的任何更改都会影响控件,对控件所做的任何更改都会影响数据源。您不需要从控件中取值并重新分配给数据源。

2)您可以使用 bindingsourcedatasource 应用 filter

3)您可以使用一个绑定到多个控件的数据源。例如,您有表格 Fruits,并将其绑定到用于分别显示 ApllesPeaches2 DataGridView。使用 bindingsourceFilter 属性,您可以分别显示 ApplesPeaches

4)你可以使用 bindingsource 进行搜索、排序、编辑和过滤。

您在基本列表上看不到 bindingsource 的好处,但还有更多超出基本列表的功能,您将看到 bindingsource 的实用性。

您可以在这里获取更多信息。


请注意,要使#1起作用,模型必须实现“INotifyPropertyChanged”。 - Eric Eskildsen

5

其中一个优点是,如果您手动操作DataGridView中的值,则更改将反映在基础数据中。 (编辑:显然,这也适用于普通的DataSource绑定。)

另一个优点是,您可以通过单击额外的空字段并编辑值来向基础数据添加条目(至少如果它是List)。这将为您添加一个新项目,无需编写任何其他代码。

enter image description here

这个详细的数据绑定教程可能有助于更好地了解数据绑定的一般能力。

编辑:

另一个区别是,对底层数据的操作,例如向列表中添加项目,即使再次分配DataSource属性也不会反映在DataGridView中,而这在ComboBox中可以使用。 但重新分配一个新的BindingSource实例将起到作用。

因此,如果您有一个人员列表:

List<pers> list = new List<pers>();
BindingSource bs = new BindingSource();
bs.DataSource = perlist;
dataGridView1.DataSource = bs;

如果您想在代码中添加新项到列表中,只需创建一个BindingSource的新实例,然后将其重新分配给DataGridView.DataSource即可。
list.Add(new pers());

bs = new BindingSource();
bs.DataSource = perlist;

dataGridView1.DataSource = bs;

并且新项目将被显示


我不确定是否有遗漏什么,但对我来说,即使没有“BindingSource”,更改也会双向反映。 - Slai
@Slai,你说得对。我想知道上次我尝试时犯了什么错误,以至于它没有成功。所以我把这个保存在我的脑海中作为优势,因为我使用了BindingSource而不是普通绑定,并解决了我的问题。 - Mong Zhu
1
许多教程和代码示例都在使用它,所以对大多数人来说似乎是必需的。当通过设计器进行数据绑定时,Visual Studio会创建BindingSource,因此可能会有一些我不知道的用途(也许是将过滤和排序逻辑与数据源分开)。BindingSource在绑定某些集合(如Dictionary)的数据时是必需的,但我没有看到它在其他方面被广泛使用。 - Slai

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