BindingSource 组件体系结构

使用组件 BindingSource ,可以通用地将所有 Windows 窗体控件绑定到数据源。

BindingSource 组件简化了将控件绑定到数据源的过程,并与传统数据绑定提供了以下优势:

  • 启用对业务对象的设计时绑定。

  • 封装 CurrencyManager 功能并在设计时公开 CurrencyManager 事件。

  • 简化了创建支持 IBindingList 接口的列表,为不本地支持列表更改通知的数据源提供列表变更通知。

  • 提供 IBindingList.AddNew 方法的可扩展性点。

  • 提供数据源与控件之间的间接级别。 当数据源在运行时可能更改时,这种间接关系非常重要。

  • 与其他与数据相关的 Windows 窗体控件互作,特别是 BindingNavigator 控件和 DataGridView 控件。

出于这些原因,组件 BindingSource 是将 Windows 窗体控件绑定到数据源的首选方法。

BindingSource 功能

BindingSource 组件提供多个功能,以支持将控件绑定到数据。 借助这些功能,你可以实现大多数数据绑定方案,几乎无需编码。

BindingSource 组件通过提供一致的接口来访问许多不同类型的数据源来实现此目的。 这意味着你使用相同的方法对任何类型进行绑定。 例如,可以将DataSource属性附加到DataSet或者业务对象上,并且在这两种情况下,使用相同的属性、方法和事件集来操作数据源。

组件提供的 BindingSource 一致接口极大地简化了将数据绑定到控件的过程。 对于提供更改通知的数据源类型, BindingSource 组件会自动在控件和数据源之间传递更改。 对于不提供更改通知的数据源类型,提供了允许引发更改通知的事件。 以下列表显示了组件支持 BindingSource 的功能:

间接

BindingSource 组件在控件和数据源之间提供一个间接层。 而不是将控件直接绑定到数据源,而是将该控件绑定到一个 BindingSource控件,并将数据源附加到 BindingSource 组件 DataSource 的属性。

通过这种间接级别,可以更改数据源,而无需重置控件绑定。 这为你提供了以下功能:

货币管理

BindingSource 组件为了你实现 ICurrencyManagerProvider 接口,以处理货币管理。 通过ICurrencyManagerProvider接口,您可以访问一个BindingSource的货币管理器,此外,还可以访问另一个绑定到相同DataMemberBindingSource的货币管理器。

BindingSource 组件封装 CurrencyManager 功能并公开最常见的 CurrencyManager 属性和事件。 下表介绍了与货币管理相关的一些成员。

CurrencyManager 属性用于获取与 BindingSource 关联的货币管理器。

GetRelatedCurrencyManager 如果另一个 BindingSource 绑定到指定数据成员,则获取其货币管理器。

Current 属性用于获取数据源的当前项。

Position 属性获取或设置基础列表中的当前位置。

EndEdit 方法将挂起的更改应用于基础数据源。

CancelEdit 方法取消当前编辑操作。

作为列表的数据源

BindingSource 组件实现 IBindingListViewITypedList 接口。 通过此实现,可以将 BindingSource 组件本身用作数据源,而无需任何外部存储。

BindingSource 组件附加到数据源时,它将数据源公开为列表。

DataSource 属性可以设置为多个数据源。 其中包括类型、对象和类型列表。 生成的数据源将作为列表公开。 下表显示了一些常见的数据源和生成的列表评估。

DataSource 属性 显示结果
空引用(Nothing 在 Visual Basic 中) 空的IBindingList对象。 添加项会将列表设置为所添加项的类型。
在 Visual Basic 中,带有 Nothing 的 Null 引用,设置为 DataMember 不支持;会引发ArgumentException
类型为“T”的非列表类型或对象 类型为“T”的空 IBindingList
数组实例 一个 IBindingList 包含数组元素。
IEnumerable 实例 一个包含IEnumerable项的IBindingList
包含类型“T”的列表实例 一个包含类型“T”的IBindingList实例。

此外, DataSource 可以设置为其他列表类型,例如 IListSourceITypedList以及 BindingSource ,将相应地处理它们。 在这种情况下,列表中所包含的类型应具有无参数构造函数。

BindingSource 作为 IBindingList

BindingSource 组件提供成员,以便将基础数据作为 IBindingList 进行访问和操作。 下表描述了其中一些成员。

成员 DESCRIPTION
List 属性 获取从 DataSourceDataMember 属性评估得到的列表。
AddNew 方法 将新项添加到基础列表。 适用于实现 IBindingList 接口并允许添加项(即属性 AllowNew 设置为 true)的数据源。

自定义项创建

可以处理事件 AddingNew 以提供自己的项创建逻辑。 在将新对象添加到 BindingSource 之前会发生 AddingNew 事件。 调用AddNew方法后,但在将新项添加到底层列表之前,会引发此事件。 通过处理此事件,可以提供自定义项创建行为,而无需从 BindingSource 类派生。 有关详细信息,请参阅 如何:使用 Windows 窗体 BindingSource 自定义项目添加

事务项创建

BindingSource 组件实现 ICancelAddNew 接口,该接口可实现事务项创建。 通过调用 AddNew临时创建新项后,可以通过以下方式提交或回滚新增内容:

  • EndNew 方法将显式提交挂起的添加。

  • 执行另一个集合作业(如插入、删除或移动)将隐式提交未完成的添加。

  • 如果方法尚未被提交,CancelNew 方法将回滚挂起的添加。

IEnumerable 支持

BindingSource 组件允许将控件绑定到 IEnumerable 数据源。 使用此组件,可以绑定到数据源,例如 System.Data.SqlClient.SqlDataReader.

IEnumerable数据源分配给BindingSource组件时,BindingSource会创建一个IBindingList,并将IEnumerable数据源的内容添加到列表中。

Design-Time 支持

某些对象类型无法在设计时创建,例如从工厂类创建的对象或 Web 服务返回的对象。 有时,你可能必须在设计时将控件绑定到这些类型,尽管内存中没有控件可以绑定到的对象。 例如,您可能需要使用自定义类型的公共属性名称标记 DataGridView 控件的列标题。

为支持此方案,BindingSource组件支持绑定到Type。 为DataSource属性分配Type时,BindingSource组件将创建一个空的BindingList<T>,其中包含Type项。 随后绑定到 BindingSource 组件的任何控件都会在设计时或运行时收到类型属性或架构的状态的警报。 有关详细信息,请参阅 “如何:将 Windows 窗体控件绑定到类型”。

Static ListBindingHelper 方法

System.Windows.Forms.BindingContextSystem.Windows.Forms.CurrencyManagerBindingSource类型都共享通用逻辑,以从DataSource/DataMember对生成列表。 此外,此常见逻辑公开供控制作者和其他第三方在以下 static 方法中使用:

使用 IBindingListView 接口进行排序和筛选

BindingSource组件实现IBindingListView接口,该接口扩展了IBindingList接口。 IBindingList 提供单列排序,IBindingListView 提供高级排序和筛选功能。 使用 IBindingListView时,如果数据源也实现其中一个接口,则可以对数据源中的项进行排序和筛选。 该 BindingSource 组件不提供这些成员的引用实现。 而是将调用转发到基础列表。

下表描述了用于排序和筛选的属性。

成员 DESCRIPTION
Filter 属性 如果IBindingListView是一个数据源,则获取或设置用于筛选查看哪些行的过滤表达式。
Sort 属性 如果数据源是 IBindingList,则获取或设置用于排序及排序顺序信息的列名。

-或-

如果数据源是IBindingListView并支持高级排序,则获取用于排序的多个列名及其排序顺序。

与 BindingNavigator 集成

可以使用 BindingSource 组件将任何 Windows 窗体控件绑定到数据源,但 BindingNavigator 控件专门设计用于搭配 BindingSource 组件。 该 BindingNavigator 控件提供用于控制 BindingSource 组件的当前项的用户界面。 默认情况下,控件 BindingNavigator 提供与组件上的 BindingSource 导航方法对应的按钮。 有关详细信息,请参阅“如何:使用 Windows 窗体 BindingNavigator 控件导航数据”

另请参阅