ListView 的说明 1:与 TreeView 控件一起使用 ListView 控件

ListView 控件经常与 TreeView 控件联合使用。(要得到有关 TreeView 控件的详细说明,请参阅“使用 TreeView 控件”。联合使用可使最终用户能够“深入”若干个层次,即用 TreeView 显示较大的结构,而用 ListView 显示选中的 Node 对象的记录集,如下所示:

TreeView 和 ListView 在一起

在该说明中,只要选中(NodeClick 事件)TreeView 控件中的“出版商”节点,代码就将出版商拥有的书目充填到 ListView 控件。

该说明通过将 ListView 控件绑定到 Biblio.mdb,进一步改进了“使用 TreeView 控件”中的说明。这四个说明的完整代码可在“ListView 的说明:完整代码”中找到。

示例应用程序:DataTree.vbp

本主题中的代码取自示例应用程序 DataTree.vbp该示例应用程序列在 Samples目录中。

下面的过程将用到这些对象:

要与 TreeView 控件一起使用 ListView 控件,请按照以下步骤执行:

  1. 在工程中添加对数据访问对象 (DAO 3.5) 的引用。

  2. 为 Database 和 ListItem 对象声明模块级变量。

  3. 向两个 ImageList 控件中充填适当的图象。

  4. 将 ImageList 控件赋给 ListView 控件的 Icons 和 SmallIcons 属性。

在 Form 的 Load 事件中:

  1. 用 OpenDatabase 语句将 Database 对象变量设置为 Biblio.mdb 数据库。

在 TreeView 控件的 NodeClick 事件中:

  1. 如果 Node 的 Tag 属性是“出版商”,则调用特定过程,以创建 ColumnHeaders 并充填 ListView 控件

在工程中添加对数据访问对象 (DAO 3.5) 的引用

要将数据库绑定到 ListView 控件,必须先添加对当前版本的数据访问对象 (DAO) 的引用。

为 Database 和 ListItem 对象声明模块级变量

由于需要在一次会话中多次访问 Biblio.mdb 数据库,通过创建全局的 Database 对象,保持打开数据库的一个拷贝能够具有更高的效率。以后再访问它的时候,就可以不必再次打开数据库了。在窗体的声明部分编写如下代码:

Private mDbBiblio As Database

(该变量被声明为 Private 的,以使其成为模块级变量。如果希望其它模块也能够使用该数据库,可以使用 Public 语句,并为该变量改名,以表示出它是全局变量,比如 gDbBiblio。)

在 ListItems 集合中添加 ListItem 对象时,需要在 Set 语句中使用 ListItem 类型的变量。

Dim TempItem As ListItem
Set TempItem = lvwDB.ListItems.Add()

虽然在添加 ListItem 对象时也可以声明变量,但只声明一个模块级 ListItem 对象变量,并用它添加所有 ListItem 对象效率会更高。还是在声明部分,编写如下代码:

Private mTempItem As ListItem

在两个 ImageList 控件中充填适当的图象

要在 ListView 控件中使用图象,必须先向两个 ImageList 控件中充填图象。随后,在设计时可将 Icons 和 SmallIcons 属性设置为这两个 ImageList 控件。请参阅“使用 ImageList 控件”以获得更多信息。

将 ImageList 控件赋予 ListView 控件的 Icons 和 SmallIcons 属性

如果不希望在设计时设置 Icon 和 SmallIcon 属性,可用如下代码在运行时设置它们:

lvwDB.Icons = imlIcons
lvwDB.SmallIcons = imlSmallIcons

不在设计时,而在运行时设置 ImageList 控件的一个原因,是可能需要为不同用户动态的更换图象。例如,使用单色显示器的用户会希望图标各部分的对比度大一些。

用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库

Form 对象的 Load 事件可用于初始化 Database 变量。代码如下:

Set mDbBiblio = DBEngine.Workspaces(0). _
OpenDatabase("BIBLIO.MDB")

成功地初始化 Database 对象变量后,就可以在代码模块中的任何地方自由地访问它了。

如果 Node 的 Tag 属性是“出版商”,则调用特定过程以创建 ColumnHeaders 并充填 ListView 控件

充填 TreeView 控件时(请参阅“使用 TreeView 控件”),每个 Node 对象的 Tag 属性都将被设置为数据库表的名称,该 Node 属于这个数据库表。在这种情况下,如果其 Tag 属性的值为“出版商”,则代码调用两个用户设计的过程。第一个是 MakeColumns,该过程为 ListView 控件创建表格的栏目。

第二个函数是 GetTitles,它向 ListView 控件中充填 ListItem 对象。该函数需要传递一个参数,即 Node 对象的 Key 属性,该属性中包含了从“出版商”表中得到的出版商的唯一 ID。GetTitles 函数用该 Key 在“标题”数据库中搜索,并返回该出版商出版的所有书目。NodeClick 的完整代码如下:

Private Sub tvwDB_NodeClick(ByVal Node As Node)
   If Node.Tag = "Publisher" Then 
      MakeColumns '创建 ColumnheadersGetTitles Val(Node.Key) '创建 ListItem 对象。
End Sub

提示 Key 属性的值不能为整型数,而只能是唯一的字符串。然而,该字符串可以由整数接上字符串构成。比如 "7 ID"。在上面的代码中使用了 Val 函数,该函数仅返回 Key 属性的整数部分的值。这样在设置 Node 对象的 Key 属性时,可在 PubID 字段的值后面接上字符串。例如:

tvwDB.Nodes(x).Key = rsPublishers!PubID & " ID"

这样,在使用 Val 函数时,将只返回原先的 PubID 值。

下一步:MakeColumns 过程

关于 MakeColumns 函数的内容,请参阅“ListView 控件的说明 2:用过程创建 ColumnHeaders”。