创建数据源

在本节中,我们将一步一步地学习创建作为数据源的数据识别类的过程。本例将绑定一个TextBox控件到数据源类中,以显示数据。下一节,“创建数据使用者”,将演示如何将数据源类绑定到某个数据使用者类。

本节中示例的代码来自于数据识别类示例(Dataware.vbp)。用户Samples目录中找到它。

创建一个数据源的过程分为两步。第一步将创建数据源类;第二步将把它挂接到某个TextBox控件上,以显示输出。

创建源类

创建源类的第一步是定义一个新类,并给予其必要的属性和方法以提供数据:

  1. 打开一个新的标准EXE工程,并插入一个类模块,方法是在“工程”菜单中选择“添加类模块”

  2. “属性”窗口中,对类的属性进行如下设置:

属性设置值

NameMySource

DataSourceBehaviorvbDataSource

当 DataSourceBehavior 被设置为 vbDataSource 时,一个新的 Sub 过程 GetDataMember 就被添加到类模块中。用户只要在代码编辑器中选择“对象”列表中的“类”,然后选择“事件”列表,即可看到此情况。

  1. 选择“工程”菜单的“引用”,然后添加对 Microsoft ActiveX Data Objects 2.0 Library 的引用。

  2. 将下面的代码添加到类模块的“声明”部分:
    Option Explicit
    Private rs As ADODB.Recordset
    

    这声明一个对象变量为ADO Recordset对象。

  3. 将下面的代码添加到类模块的 Initialize 事件过程中:
    Private Sub Class_Initialize()
    Dim strPath As String, strName As String
    Dim i As Integer
    
    ' 创建 Recordset 的一个实例。
    Set rs = New ADODB.Recordset
    
    ' 设置 Recordset 的属性。
    With rs
    .Fields.Append "DirID", adInteger
    .Fields.Append "Directory", adBSTR, 255
    .CursorType = adOpenStatic
    .LockType = adLockOptimistic
    .Open
    End With
    
    ' 在各目录中循环,并充填Recordset
    strPath = "C:\"
    strName = Dir(strPath, vbDirectory)
    i = 0
    Do While strName <> ""
    If strName <> "." And strName <> ".." Then
    If (GetAttr(strPath & strName) And _
    vbDirectory) = vbDirectory Then
    i = i + 1
    With rs
    .AddNew
    .Fields.Item("DirID") = i 
    .Fields.Item("Directory") = strName
    .Update
    End With
    End If
    End If
    strName = Dir
    Loop
    
    ' 返回到第一个记录。
    rs.MoveFirst
    End Sub
    

    在本例中用户将迅速创建一个ADO Recordset对象,并用一个目录列表来充填之。此外,用户也可以使用一个现存的recordset,方法是把它分配Initialize事件中ADO Recordset的Connect属性。

  4. “代码编辑器”中选择“对象”列表的“类”,然后选择“事件”列表中的 GetDataMember。将下面的代码添加到 GetDataMember Sub 过程中:
    Private Sub Class_GetDataMember(DataMember As String, Data As Object)
    '  Recordset 分配给 Data 对象。
    Set Data = rs
    End Sub
    

    GetDataMember 过程设置类的数据源。数据源类可以提供多个数据源,方法是将一个 Select Case 语句添加到 GetDataMember 过程中,并在 DataMember 参数中传入一个源名。

  5. 将一个新的 Sub 过程,以提供在 Recordset 中循环的公共方法:
    Public Sub Cycle()
    '  Recordset 中循环。
    rs.MoveNext
    If rs.EOF = True Then
    rs.MoveFirst
    End If
    End Sub
    

    为了在 recordset 中移动,用户需要显露所创建类的浏览方法。为了简单起见,本示例只能在 recordset 中向前循环。为了使得该类更加实用,您可能想要显露象MoveFirst、MoveNext、Add,以及Delete这样的方法。

使用源类

现在已对源类作了定义,我们可以用它来做些有用的事情了。在本例中,我们将把它绑定到某个TextBox控件上,这样就可以看到其输出了;我们还将使用一个CommandButton来执行我们的Cycle方法。

  1. 选择 Form1,并添加一个TextBox控件和一个CommandButton控件到窗体中。

  2. “属性”窗口中,如下设置TextBox的属性:

属性设置值

NametxtConsumer

Text(blank)

  1. “属性”窗口中,如下设置CommandButton的属性:

属性设置值

NamecmdCycle

CaptionCycle

  1. 选择“工程”菜单中的“引用”,并添加对 Microsoft Data Binding Collection 的引用。

    Data Binding Collection所提供的DataBinding对象是将一个数据源绑定到某个数据使用者的“粘合剂”。

  2. 将下面的代码添加到类模块的“声明”部分:
    Option Explicit
    Private objSource As MySource
    Private objBindingCollection As BindingCollection
    

    需要用事前绑定来声明源类(MySource)和BindingCollection对象。

  3. 将下面的代码添加到 Form_Load 事件过程中:
    Private Sub Form_Load()
    Set objSource = New MySource
    Set objBindingCollection = New BindingCollection
    
    ' 将源类分配给 Binding Collection  DataSource 属性。
    Set objBindingCollection.DataSource = objSource
    ' 添加一个绑定。
    ObjBindingCollection.Add txtConsumer, "Text", "Directory"
    

    在Load事件中,我们创建了源类和BindingCollection对象的实例,然后将源对象分配给BindingCollection的DataSource属性。最后,我们添加一个绑定,方法是指定使用者名 (txtConsumer)、被绑定的使用者的属性(即Text属性),以及要绑定到的源对象的Field属性 (Directory)。

  4. 将下面的代码添加到cmdCycle Click事件过程中:
    Private cmdCycle_Click()
    ' 调用数据源的 Cycle 方法。
    ObjSource.Cycle
    End Sub
    

    这将执行源类的 Cycle 方法。

    
    
  5. 按下 F5 键,运行该工程。

    单击“Cycle”按钮时,源类所创建的recordset的目录名将出现在TextBox中。祝贺您──您刚刚在未使用Data控件的情况下,将一个控件绑定到某个数据源类上!

  6. 保存工程。当提示输入文件名时,使用下面的名字。

    将源类保存为 "MySource.cls"。

    将窗体保存为 "Dataform.frm"。

    将工程保存为 "Dataware.vbp"。

    这些文件都将在后面的“创建数据使用者”中用到。

在下一节“创建数据使用者”中,我们将讨论创建一个作为数据使用者的数据识别类的过程。