65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (7投票s)

2009年6月20日

CPOL

3分钟阅读

viewsIcon

78956

downloadIcon

2291

数据绑定 - Bindinglist、BindingSource 和业务对象

引言

我一直在一个使用 .NET 3.5 的 Windows 应用程序上工作。 在此应用程序中,我们应该订阅通过业务对象进行交互的 WebServices。 由于我们正在增强一个现有的应用程序,一些业务对象已经被定义。 现在,我应该找到一种方法,使我们可以在 UI 层中使用数据绑定。 在浏览互联网之后,我决定坚持使用 BindingList,并提供更多的灵活性,将其包装在 BindingSource 中。

原因

我脑海中的想法

  1. 业务对象将用于层之间的数据通信。
  2. 需要快速简便的实现方法。
  3. 该方法应通过数据绑定减少代码行数来帮助开发人员。

BindingList 和 BindingSource 的详细信息

在这篇文章中,我将解释任何人都可以轻松使用 BindingList BindingSource。 我采用了一个主从关系示例——员工和员工详细信息。

创建两个独立的业务实体 EmployeeBE EmpDetails。 现在,要为相应的业务实体创建 BindingList 类,请使用以下代码 – BindingList<T>

public class EmployeeBEList : BindingList<EmployeeBE>
{
}
public class EmpDetailsList : BindingList<EmpDetails>
{
}

现在,在 EmployeeBE 中引用 BindingList<EmpDetails> 来维护主从关系。 所以这是一个非常快速和简单的实现。 这也可以用于现有的业务对象。

创建业务对象后,让我们专注于 UI 部分。 创建一个由不同搜索条件组成的简单搜索面板。 另外,为选定的员工提供几个用于员工和员工详细信息的网格。 现在来了 BindingSource ,我们将使用它来进行设计时数据绑定。

BindingSource1_small.JPG

如图所示,将 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 相比,您必须维护一个列表来跟踪已更改的项目列表。 我通过保留一个整数数组并捕获 BindingSourceListChanged 事件来做到这一点。

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 的一些更高级的领域。

© . All rights reserved.