将控件绑定到数据源

Visual Basic 允许把控件属性标记为可绑定的。允许您创建数据识别的控件。开发者可以将可绑定的属性与任何数据源中的字段关联起来,从而能够更加方便地使用控件编写数据库应用程序。

从“工具”菜单访问“过程属性”对话框,然后就可以把控件的属性标记为可绑定的。在图 9.9 中,通过单击对话框的“高级”按钮,数据绑定选项成为可用的。

图 9.9 用于 ActiveX 控件属性的数据绑定选项

Visual Basic 提供的控件可以通过其 DataSource 和 DataField 属性绑定到数据库字段。可以选择控件的一个属性绑定到 DataField 属性。一般说来,这将是控件持有的所有数据中最重要一部分。

尽管一次只能标记一个字段绑定到 DataField 属性所指定的字段,但是,可以把 ActiveX 控件的其它属性标记为可绑定的。开发者可以使用 DataBindings 集合将这些额外的可绑定的属性绑定到数据字段。

注意 有的开发工具和控件容器不支持数据绑定。本主题说明的是 Visual Basic 对数据绑定控件提供的支持。

DataBindings 集合

DataBindings 集合是 Visual Basic 为控件的使用者提供的扩展属性,它允许开发者访问控件的可绑定属性列表。

注意 所有的可绑定属性在运行时都出现在 DataBindings 集合中。在设计时,如果在“属性”窗口中访问 DataBindings 属性,只有被标记为“设计时在 DataBindings 集合中显示”的属性才会出现。

例如,如果要用标签和文本框作为子控件创建一个 Address 控件组合,那么控件的可绑定属性将对应于控件上的文本框,如图 9.10 所示:

图 9.10 具有多个字段的 Address 控件组合

注意 如果您的控件具有多个可绑定的属性,则必须将其中之一标记为绑定在扩展对象的 DataField 属性上。否则,扩展对象将不会为您的控件提供 DataSource 属性。可在属性对话框中选择“该属性绑定到 DataField”,将属性标记为绑定到 DataField。也可用 DataBindings 集合绑定标记为绑定到 DataField 的属性。

控件属性与子控件内容之间的映射是通过委派实现的,如下面的代码所示:

Public Property Get AddressLine1() As String
   AddressLine1 = txtAddressLine1.Text
End Property

Public Property Let AddressLine1(NewValue As String)
   If CanPropertyChange("AddressLine1")
      txtAddressLine1.Text = NewValue
      '以下程序行通知 Visual Basic 
      '属性已经被改变了--如果去掉这行
      '程序,将不会更新数据源!
      PropertyChanged "AddressLine1"
   End If
End Property

委派给文本框控件意味着由文本框负责所有的工作:包括显示属性值和接收属性的改变。在文本框显示属性值的时候,用户可以改变它,所以还必须在文本框的 Change 事件中将该属性标记为“改变了的”,如下所示:

Private Sub txtAddressLine1_Change()
   PropertyChanged "AddressLine1"
End Sub

重点 为了把新值写回数据源,必须调用 PropertyChanged。如果不调用 PropertyChanged 方法,控件将不会更新数据源。

详细信息 关于 PropertyChanged 方法的另一个重要用途,请参阅本章后面的“在控件中添加属性”一节。

调用 CanPropertyChange

在改变属于数据绑定范畴的属性值之前,控件必须调用 CanPropertyChange。如果 CanPropertyChange 返回 False,就不要设置属性值。否则在某些控件容器中可能会引起错误。

如果控件总是调用 CanPropertyChange,则可以在“过程属性”对话框上选择“属性改变前调用 CanPropertyChange”复选项。

注意 目前的 Visual Basic 中的 CanPropertyChange 总是返回 True,即使被绑定字段在数据源中是只读的。这在上述的代码中不会引起问题,因为当程序试图改变一个只读字段时,Visual Basic 不会产生错误,但它不会更新数据源。

在运行时发现并设置可绑定属性

如果开发者将 AddressBox 控件的一个实例置于窗体上,他可以执行如下代码来列出所有的可绑定属性:

   Dim dtb As DataBinding
   For Each dtb In AddressBox1.DataBindings
      Debug.Print dtb.PropertyName
   Next

在运行时,开发者可以用如下代码将 AddressLine1 属性与 AddrLine1 字段绑定,前提是在 DataSource扩展属性指定的数据源上该字段是可用的:

   AddressBox1.DataBindings( _
      "AddressLine1").DataField = "AddrLine1"

查明字段是否已经改变

可以通过检查 DataBinding 对象的 DataChanged 属性来确定一个字段的值是否发生了改变。该属性与绑定控件的 DataChanged扩展属性功能相同。

在设计时设置多个数据绑定

在运行时可绑定属性总是出现在 DataBindings 集合中。按照缺省规定,它们不会出现在设计时的“数据绑定”对话框中。

如果希望使某个可绑定属性出现在“数据绑定”对话框中,则可在“过程属性”对话框中选择那个属性,然后单击“在绑定集合中显示这个属性”。

图 9.11 使用“数据绑定”对话框

在“数据字段”对话框中显示了数据源上的所有可用字段,该数据源由控件实例的 DataSource扩展属性的当前值指定。

属性和标志

对于过去曾经开发过 OLE 控件的制作者,可以使用下表来查看“过程属性”对话框设置了哪些标志。此表也显示出如何通过 Visual Basic 可扩展性模型中的 Member 对象来访问这些属性。

属性 标志 成员对象
属性是数据绑定的。 BINDABLE Bindable
本属性绑定到 DataField。 DEFAULTBIND DefaultBind
在设计时显示在 DataBindings 集合中。 DISPLAYBIND DisplayBind
在改变前属性调用 CanPropertyChange。 REQUESTEDIT RequestEdit