数据绑定 - Bindinglist、BindingSource 和业务对象 - 第 1 部分






4.88/5 (7投票s)
数据绑定 - Bindinglist、BindingSource 和业务对象
引言
我一直在一个使用 .NET 3.5 的 Windows 应用程序上工作。 在此应用程序中,我们应该订阅通过业务对象进行交互的 WebServices。 由于我们正在增强一个现有的应用程序,一些业务对象已经被定义。 现在,我应该找到一种方法,使我们可以在 UI 层中使用数据绑定。 在浏览互联网之后,我决定坚持使用 BindingList,并提供更多的灵活性,将其包装在 BindingSource 中。
原因
我脑海中的想法
- 业务对象将用于层之间的数据通信。
- 需要快速简便的实现方法。
- 该方法应通过数据绑定减少代码行数来帮助开发人员。
BindingList 和 BindingSource 的详细信息
在这篇文章中,我将解释任何人都可以轻松使用 BindingList
和 BindingSource
。 我采用了一个主从关系示例——员工和员工详细信息。
创建两个独立的业务实体 EmployeeBE
和 EmpDetails
。 现在,要为相应的业务实体创建 BindingList
类,请使用以下代码 – BindingList<T>
。
public class EmployeeBEList : BindingList<EmployeeBE>
{
}
public class EmpDetailsList : BindingList<EmpDetails>
{
}
现在,在 EmployeeBE
中引用 BindingList<EmpDetails>
来维护主从关系。 所以这是一个非常快速和简单的实现。 这也可以用于现有的业务对象。
创建业务对象后,让我们专注于 UI 部分。 创建一个由不同搜索条件组成的简单搜索面板。 另外,为选定的员工提供几个用于员工和员工详细信息的网格。 现在来了 BindingSource
,我们将使用它来进行设计时数据绑定。

如图所示,将 EmployeeBE
作为搜索条件的 BindingSource
的数据源添加。 以同样的方式,我们可以为 datagrid
拥有 bindinglist
,其中将显示搜索结果。 此 bindingsource
将 EmployeeBEList
作为数据源。 现在将每个 UI 元素与相应的 BindingSource
绑定。
我想解释一下 State 下拉列表的数据绑定。 要填充此 State 下拉列表,您可以拥有 MasterBE
(具有 Code
和 Description
属性)。 同样,为此
创建另一个 MasterBEList
: BindingList
<MasterBE>BindingList
。 现在将下拉列表与 BindingSource
关联,该 BindingSource
将 MasterBEList
作为数据源。 设置下拉列表的两个属性,如下所示 -DisplayMember
– “Description” 和 ValueMember
– “Code”。 这些是 MasterBE
的属性。 到目前为止,我们已经完成了 State 的填充和显示。 现在我们必须进行更改,以便我们可以从 UI 将搜索到的 State 代码传递到下一层。 使用以下代码(或使用设计器),下拉列表的 SelectedValue
属性绑定到 bindingSourceSearchCriteria BindingSource
的“StateCode
”。
this.cmbState.DataBindings.Add(new System.Windows.Forms.Binding
("SelectedValue", this.bindingSourceSearchCriteria, "StateCode",
true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
需要注意的重要事项是 DataSourceUpdateMode
设置为 OnPropertyChanged
。 这意味着,即使通过代码更改了 SelectedValue
的值,也会反映在 BindingSource
中,而 OnValidation
需要用户交互。
现在我将快速浏览 CRUD 操作。 在检索时,获取从 DAL 层返回的对象列表并关联到 datasource
。
private void btnSearch_Click(object sender, EventArgs e)
{
DAL objDal = new DAL();
EmployeeBE searcchCriteria = (EmployeeBE)bindingSourceSearchCriteria.Current;
bindingSourceSearchResult.DataSource =
objDal.SearchEmployee(searcchCriteria.FirstName, searcchCriteria.StateCode);
}
现在,一旦填充数据,其余的事情将由 BindingSource
负责。 要添加新记录,即 BusinessObject
,请使用以下代码片段
private void btnAdd_Click(object sender, EventArgs e)
{
EmployeeBE newEmp = this.bindingSourceSearchResult.AddNew() as EmployeeBE;
}
对于删除,您只需要从 BindingSource
中删除 BusinessObject
即可。
private void btnDelete_Click(object sender, EventArgs e)
{
EmployeeBE selectEmp = this.bindingSourceSearchResult.Current as EmployeeBE;
this.bindingSourceSearchResult.Remove(selectEmp);
}
可以在对列表执行创建/删除/更新之后保存 BindingSource
。 这主要用于批量更新。
与 DataSet
相比,您必须维护一个列表来跟踪已更改的项目列表。 我通过保留一个整数数组并捕获 BindingSource
的 ListChanged
事件来做到这一点。
private void bindingSourceSearchResult_ListChanged
(object sender, ListChangedEventArgs e)
{
//int added = 0;
switch (e.ListChangedType)
{
case ListChangedType.ItemAdded:
//added = e.NewIndex;
if (!_addedRowIndexes.Contains(e.NewIndex)) //fires for each cell changed.
//Only add row index once
_addedRowIndexes.Add(e.NewIndex);
break;
case ListChangedType.ItemChanged:
//Will fire when editing a new row. Make sure the row editing isn't new
if (!_changedRowIndexes.Contains(e.NewIndex) &&
!_addedRowIndexes.Contains(e.NewIndex))
_changedRowIndexes.Add(e.NewIndex);
break;
default:
break;
}
}
结论
到目前为止,这是一种非常简单快速的实现方法,带有设计时数据绑定。 可能还有其他实现相同场景的方法,但我认为这种方法非常简单。 显然,BindingList
默认不支持 Sorting
,我将在我的下一篇文章中介绍。
历史
- 2009 年 6 月 20 日:首次发布
这是我关于 Databinding
的文章。 在下一篇文章中,我将讨论 BindlingList
和 BindingSource
的一些更高级的领域。