|
实现数据绑定
为该控件编写代码的第一步是创建项目和相应的起始类。在本例中,我首先创建一个新 Windows 控件库,然后删除默认的 UserControl 类,并用一个从 TreeView 控件继承的新类来代替它:
Public Class dbTreeControl Inherits System.Windows.Forms.TreeView
从这时起,我将设计一个可以放入到窗体中的控件,并使其具有常规的 TreeView 的外观和功能。下一步是开始添加旨在处理在 TreeView 中加入的新功能所需的代码,即数据绑定和分组数据。 添加 DataSource 属性
我的新控件的所有功能都很重要,但构建复杂数据绑定控件的两个关键问题是处理 DataSource 属性和从数据源的每个对象中检索单个项目。 创建属性例程
首先,任何用于实现复杂数据绑定的控件都需要实现一个 DataSource 属性例程,并保持适当的成员变量:
| Private m_DataSource As Object
_ Public Property DataSource() As Object Get Return m_DataSource End Get Set(ByVal Value As Object) If Value Is Nothing Then cm = Nothing GroupingChanged() Else If Not (TypeOf Value Is IList Or _ TypeOf Value Is IListSource) Then ' 不是针对该用途的有效数据源 Throw New System.Exception("无效 DataSource") Else If TypeOf Value Is IListSource Then Dim myListSource As IListSource myListSource = CType(Value, IListSource) If myListSource.ContainsListCollection = True Then Throw New System.Exception("无效 DataSource") Else ' 对,对。它是有效的数据源 m_DataSource = Value cm = CType(Me.BindingContext(Value), _ CurrencyManager) GroupingChanged() End If Else m_DataSource = Value cm = CType(Me.BindingContext(Value), _ CurrencyManager) GroupingChanged() End If End If End If End Set End Property
| IList 接口
可用作复杂数据绑定数据源的对象通常都支持,该接口将数据公开为对象集合,并提供若干有用属性,如 Count。我的新 TreeView 控件要求在其绑定中使用一个支持 IList 的对象,但使用另一个接口也可以,因为它提供了一个获取 IList 对象的简便方法 (GetList)。当设置 DataSource 属性后,我首先确定是否提供了有效的对象,即一个支持 IList 或 IListSource 的对象。我真正想要的是 IList,因此如果对象仅支持 IListSource(例如 DataTable),那么我将使用该接口的 GetList() 方法获得正确的对象。
某些实现 IListSource 的对象(如 DataSet)实际上包含多个由 ContainsListCollection 属性表示的列表。如果该属性为 True,则 GetList 将返回一个表示列表(包含多个列表)的 IList 对象。在我的示例中,我决定支持直接连接到 IList 对象或仅包含一个 IList 对象的 IListSource 对象,并忽略需要附加工作来指定数据源的对象,如 DataSet。
注意:如果要支持此类对象(DataSet 或与之类似的对象),您可以再添加一个属性(如 DataMember)来指定用于绑定的特定子列表。
如果提供的数据源有效,则最终结果是创建的实例 (cm = Me.BindingContext(Value))。由于该实例将用于访问基础数据源、对象属性和位置信息,因此被存储在局部变量中。
|