哪位指点一下treeview的用法

KillClear 2009-11-15 05:51:05
哪里有这个控件?怎么使用?
最好有代码
...全文
109 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
king06 2009-11-16
  • 打赏
  • 举报
回复
最主要的是掌握 Add方法 ,然后一个一个看treeview的属性就知道这么回事了,很多都是可以从字面上就知道意思的
Flyingdragon168 2009-11-16
  • 打赏
  • 举报
回复
呵呵,樓上那些都非常詳細,走了。
cbm6666 2009-11-16
  • 打赏
  • 举报
回复
有需要的话留下邮箱, 我给你一堆示例代码, 多看再自己试做, 还不会的话你找我.



  • 打赏
  • 举报
回复
要看楼主的要求是什么。
对症下药,
kongbei 2009-11-15
  • 打赏
  • 举报
回复
看看这个吧,视频教程讲的挺细,不过也只讲了基本的用法:http://www.cnblogs.com/thcjp/archive/2008/01/09/559857.html
chinaboyzyq 2009-11-15
  • 打赏
  • 举报
回复
TreeView 控件应用实例:将 TreeView 绑定到 Biblio.mdb 数据库

应用示例:DataTree.vbp
本章的代码示例是从应用示例 DataTree.vbp which is listed in the Samples directory中得到的。

可将数据库中的数据绑定到 TreeView 控件。下面的示例将 TreeView 控件绑定到 Biblio 数据库,该数据库可以在 Visual Basic CD 中找到。该应用实例将 Publishers 表作为树节点的第一层。如果一个出版商对应于一个或多个书名,则这些书名将作为该出版商的子节点加入树中。

图 2.42 与数据绑定的 TreeVew 控件



下面的代码用到了如下对象:

Data Access Object Library(3.5)

名为“frmDataTree”的 Form 对象

名为“tvwDB”的 TreeView 控件

名为“cmdLoad”的 CommandButton 控件
将 Biblio.mdb 数据库绑定到 TreeView 控件

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

为 Database 和 Node 对象创建模块级的变量。
在 Form Load 事件中,用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库。

用 Nodes 集合的 Add 方法创建顶层的节点对象。
在 CommandButton 的 Click 事件中,创建两个 Recordset 变量,并将它们设置为 Publishers 和 Titles 表。

用“Do Until”语句为表中的每个出版商创建一个 Node 对象。

对每个出版商,在 Titles 记录集中检查匹配的 PubID 字段;为每个匹配项添加一个子节点。
在工程中添加对数据访问对象(DAO 3.5)的引用
要将数据库绑定到 TreeView 控件,必须先添加对当前版本的数据访问对象(DAO)的引用。

为 Database 对象和 Node 对象创建模块级的变量
由于需要在一个会话中多次访问 Biblio.mdb 数据库,如果创建一个模块级的 Database 对象,保持一个打开数据库,将有助于提高效率。此后,不需要打开数据库即可访问它。在窗体的声明部分,键入如下内容:

Private mDbBiblio As Database

如果希望该数据库还可被其它模块使用,可以用 Public 语句,并重命名该变量,以表明它是全局的,例如 gDbBiblio。

在创建 Node 对象时,在 Set 语句中(如下所示)使用 Node 类型的变量。

Dim TempNode As Node
Set TempNode = tvwDB.Nodes.Add()

虽然可以在添加 Node 对象时创建变量,更有效的方式是声明一个模块级的 Node 对象变量,并用它创建所有的 Node 对象。在上述声明部分再键入:

Private mNode As Node

用 OpenDatabase 语句将 Database 对象变量设置为 Biblio 数据库
Form 对象的 Load 事件中可以初始化 Database 变量。代码如下:

Set mDbBiblio = DBEngine.OpenDatabase("BIBLIO.MDB")

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

Form Load 事件:用 Nodes 集合的 Add 方法创建顶层的 Node 对象
至此,Database 对象变量已经被初始化为 Biblio 数据库,现在可以创建树中的第一个节点,并将打开的数据库的名称赋予它。首先必须用 Node 集合的 Add 方法创建第一个 Node 对象。还要使用 Set 语句将其赋给 mNode 对象变量,如下所示:

Set mNode = tvwDB.Nodes.Add() ' 创建第一个节点。
mNode.Text = mDbBiblio.Name

注意,在上面的代码中,在创建 Node 的同时用 Set 语句将其赋给了 mNode 对象变量。由于 mNode 变量现在包含了新创建的 Node 对象,可以对该 Node 对象的属性进行赋值。在上述情况下,Database 的名称(即 Database 对象的 Name 属性)已经被赋给了新节点的 Text 属性。

CommandButton Click 事件:创建两个 Recordset 变量,并将它们分别设置为 Publishers 和 Titles 表
本应用实例假定存在名为“cmdLoad”的按钮,并且当用户单击它时,置入 Biblio 数据库中的两个表到 TreeView 控件中。为此,必须首先在该按钮的 Click 事件中声明两个 DAO 对象变量。第一个变量 rsPublishers 用来包含 Publishers 表。第二个变量 rsTitles 用来包含 Titles 表。下面的代码声明了这两个变量,并用 OpenRecordSet 方法将表赋给变量:

Dim rsPublishers As Recordset
Dim rsTitles As Recordset

Set rsPublishers = mDbBiblio. _
OpenRecordset("Publishers", dbOpenDynaset)
Set rsTitles = mDbBiblio. _
OpenRecordset("titles", dbOpenDynaset)

用 Do Until 语句为表中的每个出版商创建一个 Node 对象
现在有两个打开的记录集,可以遍历每个记录集,创建 Node 对象,并为该对象的 Text 属性赋予合适的值。首先,必须遍历 Publishers 表,并为该表中的每个出版商创建一个 Node 对象。

下列简化了的代码可以用一句话概括为,“逐个处理每个记录,直到记录集的末尾:创建 Node 变量,并将 Title 字段的值赋给其 Text 属性,移到下一记录并重复”:

Do Until rsPublishers.EOF
Set mNode = tvwDB.Nodes.Add(1, tvwChild)
mNode.Text = rsPublishers!Name
rsPublishers.MoveNext
Loop

注意,在上面的 Add 方法中用了两个参数。第一个参数(1)是我们希望添加入节点的 Node 的 Index 属性。也就是说,希望所有的出版商节点成为第一个(根)节点(在 Form 的 Load 事件中创建的)的子节点。第二个参数使用了常数 (tvwChild),该常数指定新的 Node 将成为编号为“1”的 Node 的子节点。

对每个出版商,在 Titles 记录集中检查匹配的 PubID 字段;为每个匹配项添加一个子节点
上面的代码将 Publishers 表的内容作为第一层填入 TreeView 中。然而,我们还希望能够进入更深一层,为每个出版商节点增加子节点。每个子节点代表该出版商印刷的一本书。

为了做到这一点,如果有了对新创建的出版商节点 (mNode) 的引用,只要遍历 Titles 记录集,并检查每条记录的 PubID 字段即可。如果该字段与 Publishers 记录集中的 PubID 字段相匹配,则该书是由当前的出版商出版的。但是,在能够为 mNode 添加节点之前,还必须先将 mNode 的 Index 属性赋给一个变量 (intIndex),如下所示:

intIndex = mNode.Index

然后就可以在 Add 方法中使用该变量了,Add 方法需要用来加入子节点的 Node 对象的 Index 属性:

Set mNode = tvwDB.Nodes.Add(intIndex, tvwChild)

如下简化的代码可被表述为“直到 Recordset 的结尾:创建子 Node 对象,并将 Title 字段的值赋给它的 Text 属性;移动到下一记录并重复上述操作”:

Do Until rsTitles.EOF
If rsPublishers!PubID = rsTitles!PubID Then
Set mNode = tvwDB.Nodes.Add(intIndex, tvwChild)
mNode.Text = rsTitles!Title 'Text 属性。
End If
Loop

完成代码
上面的代码显示了用两个相关的表填成一个表的基本策略。全部代码如下:

'必须设置对 DAO 3.5 的引用。
'在声明部分,声明模块级的对象变量:
Private mDbBiblio As Database
Private mNode As Node

Private Sub Form_Load()
'在 Form_Load 事件中,设置对象变量,
'并创建 TreeView 控件的第一个 Node 对象。

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

tvwDB.Sorted = True
Set mNode = tvwDB.Nodes.Add()
mNode.Text = "Publishers"
mNode.Tag = mDbBiblio.Name '设置 Tag 属性。
mNode.Image = "closed" '设置 Image
'属性
End Sub

Private Sub cmdLoad_Click()
'声明 DAO 对象变量,
'并将记录集赋予它们。
Dim rsPublishers As Recordset
Dim rsTitles As Recordset
Set rsPublishers = mDbBiblio. _
OpenRecordset("Publishers", dbOpenDynaset)
Set rsTitles = mDbBiblio. _
OpenRecordset("titles", dbOpenDynaset)

'移到第一条记录。
rsPublishers.MoveFirst

Dim intIndex As Integer '用于索引的变量。

'直到最后一条记录 (EOF):添加一个 Node 对象,
'并用 Name 字段作为新
'Node 对象的文本。
Do Until rsPublishers.EOF
Set mNode = tvwDB.Nodes.Add(1, tvwChild)
mNode.Text = rsPublishers!Name
mNode.Tag = "Publisher" 'Tag 标识该表。
'为 Key 赋予唯一的 ID
mNode.Key = CInt(rsPublishers!PubID) & " ID"
'将变量 intIndex 设置为新创建 Node 的 Index 属性。
'用该变量将子 Node 对象加入当前 Node。
intIndex = mNode.Index
'对这条记录,在 Title 表中查找与 Titles 记录集
'中出现相同 PubID 的记录。如果找到这样的记录,
'则在 TreeView 控件中加入 Node 对象,并将用所
'找到记录的 Title、 ISBN 和 Author 字段为新
'Node 对象的属性赋值。
Do Until rsTitles.EOF
If rsPublishers!PubID = rsTitles!PubID Then
Set mNode = tvwDB.Nodes. _
Add(intIndex, tvwChild)
mNode.Text = rsTitles!Title '文本。
mNode.Key = rsTitles!ISBN '唯一的 ID。
mNode.Tag = "Authors" '表名。
mNode.Image = "leaf" '图象。
End If
rsTitles.MoveNext 'Titles 中 的下一条记录。
Loop
'将 rsTitles 重新设置为 Titles 的第一条记录。
rsTitles.MoveFirst
'移动到下一条 Publisher 记录。
rsPublishers.MoveNext
Loop
End Sub

增加代码
使用 SQL 语句创建较小的“Titles”记录集,可以对这个示例加以改进。下面的代码创建只包含相同 PubID 值的记录的记录集:

Set rsTitles = mDbBiblio.OpenRecordset _
("select * from Titles Where PubID = " & _
rsPublishers!PubID)

然后该代码就只需对较小的记录集进行循环,因而效率比较高。修改后的代码如下:

Private Sub cmdLoad_Click()
Dim rsPublishers As Recordset
Dim rsTitles As Recordset
Set rsPublishers = mDbBiblio. _
OpenRecordset("Publishers", dbOpenDynaset)
Dim intIndex
Do Until rsPublishers.EOF
Set mNode = tvwDB.Nodes.Add(1, tvwChild)
mNode.Text = rsPublishers!Name
mNode.Tag = "Publisher" '标识表。
mNode.Key = rsPublishers!PubID & " ID"
mNode.Image = "closed"
intIndex = mNode.Index
'对这条记录,使用查询创建 Title 表的记录集,
'查询条件是所有包含相同 PubID 的记录。对结果记录集中
'的每一条记录,在 TreeView 控件中加入一个 Node 对象,
'并用记录的 Title、 ISBN 和 Author 字段为新
'Node 对象的属性赋值。
Set rsTitles = mDbBiblio.OpenRecordset _
("select * from Titles Where PubID = " & _
rsPublishers!PubID)
Do Until rsTitles.EOF
Set mNode = tvwDB.Nodes. _
Add(intIndex, tvwChild)
mNode.Text = rsTitles!TITLE '文本。
mNode.Key = rsTitles!ISBN '唯一的 ID。
mNode.Tag = "Authors" '表名。
mNode.Image = "smlBook" '图象。
'移动到 rsTitles 中的下一个记录。
rsTitles.MoveNext
Loop
'移动到下一个 Publishers 记录。
rsPublishers.MoveNext
Loop
End Sub
贝隆 2009-11-15
  • 打赏
  • 举报
回复
使用 TreeView 控件


TreeView 控件可以用来显示具有层次结构的数据,例如组织树、索引项、磁盘中的文件和目录等。

图 2.40 典型的 TreeView



可能的用途
创建用户可以操作的组织树。


创建能够显示至少两层或更多层的数据库树。
设置 Node 对象属性
“树”由一些层叠的“节点”分支构成,每个节点通常包括图象(用 Image 属性设置)和标签(由 Text 属性设置)。节点的图象由与 TreeView 控件相关联的 ImageList 控件提供。关于与其它控件共同使用 ImageList 控件的更多信息,请参阅“使用 ImageList 控件”。

节点可被展开或折回,这取决于它是否有子节点,即从它出发的节点。在最上层是“根”节点,每个“根”节点可以具有任何数目的子节点。节点的总数没有限制(除非受到机器资源的限制)。图 2.41 显示了具有两个根节点的树。其中“Root 1”有三个子节点,“Child 3”自己又有一个子节点。“Root 2”有子节点,由“+”号指出,但没有展开。

图 2.41 根和子节点



树中的每个节点实际上是可编程的 Node 对象,它属于 Nodes 集合。同在其它集合中一样,集合的每个成员具有唯一的 Index 和 Key 属性,通过这些属性可以访问相应节点的其它属性。例如,下面的代码用特定节点的 Index (“7”) 设置其 Image 和 Text 属性:

tvwMyTree.Nodes(7).Image = "closed"
tvwMyTree.Nodes(7).Text = "IEEE"

然而,如果唯一的键被赋给了该节点,例如“7 ID”,那么上述代码可被改写如下:

tvwMyTree.Nodes("7 ID").Image = "closed"
tvwMyTree.Nodes("7 ID").Text = "IEEE"

节点间的关系和对关系节点的引用
每个节点可以是子节点,也可以是父节点,这取决于它与其它节点之间的关系。Node 对象具有一些属性,可以用来返回子节点或父节点的各种信息。例如,下面的代码用 Children 属性返回某个节点的子节点个数。

MsgBox tvwMyTree.Nodes(10).Children

然而,另外一些属性与 Children 属性不同,它们不返回信息,但返回对其它节点对象的引用。例如,Parent 属性返回对特定节点(只要该节点不是根节点)的父节点的引用。利用该引用,可以调用适用于 Node 对象的任何方法或设置属性来管理其父节点。例如,下面的代码返回父节点的 Text 和 Index 属性:

MsgBox tvwMyTree.Nodes(10).Parent.Text
MsgBox tvwMyTree.Nodes(10).Parent.Index

提示 使用 Set 语句处理 Node 类型的对象,以管理对其它 Node 对象的引用。例如,下面的代码将 Node 对象变量设置为 Parent 属性返回的引用。然后用该对象变量返回相关节点的属性:

Dim tempNode As Node '声明对象变量。
'将对象变量设置为返回的引用。
Set tempNode = tvwMyTree.Nodes(10).Parent
MsgBox tempNode.Text '返回父节点的 Text。
MsgBox tempNode.Index '返回父节点的 Index。

向 Nodes 集合中添加 Node 对象
要将 Node 添加到树中,可以用 Add 方法(Nodes 集合)。该方法包括两个参数,relative 和 relationship,它们确定节点被加到何处。第一个参数 relative 指定节点名称,第二个参数 relationship 指定新加入的节点与名为 relative 的节点之间的关系。

例如,下面的代码添加名为“11 node”的节点,并使其成为名为“7 node”的节点的子节点。固有常数 tvwChild 指出新节点是前一参数所指定的节点的子节点。第三个参数设置新节点的 Key 属性。

tvwMyTree.Nodes.Add "7 node", tvwChild, "11 node"

其它可能的关系包括:

常数 值 描述
tvwLast 1 该 Node 被放在所有与 relative 节点同级的节点之后。
tvwNext 2 该 Node 放在名为 relative 的节点之后。
tvwPrevious 3 该 Node 放在名为 relative 的节点之前。
tvwChild 4 该 Node 成为名为 relative 节点的子节点。


例如,假设已存在三个节点,如果想将第四个节点放在第二个和第三个节点之间,则代码如下:

'假设第二个节点的 Key 值为“2 node”。
tvwMyTree.Nodes.Add "2 node", tvwNext

Add 方法的其它参数是 key、text 和 image。用这些参数,可以在创建 Node 对象时,为其赋予 Key、Text 和 Image 属性。

详细信息 关于 Nodes 集合 Add 方法的更多信息,请在索引搜索中键入“Add 方法”并单击“Add 方法 (Nodes 集合)”,参阅“Add 方法”。

添加节点的第二个方法是:声明 Node 类型的对象变量,然后使用带 Add 方法的 Set 语句。该 Set 语句将该对象变量设置为新节点。然后就可以用该对象变量设置节点的属性,如下所示:

Dim nodX As Node
Set nodX = tvwMyTree.Nodes.Add("10 node", tvwChild)
nodX.Key = "11 node"
nodX.Text = "IEEE"
nodX.Image = "closed"

提示 使用带 Add 的 Set 语句,可使代码可读性强、容易调试。然而,如果使用 Add 方法及其参数添加节点,代码速度更快。
贝隆 2009-11-15
  • 打赏
  • 举报
回复
以下摘录自MSDN:

Add 方法(Nodes 集合)


在 Treeview 控件的 Nodes 集合中添加一个 Node 对象。

语法

object.Add(relative, relationship, key, text, image, selectedimage)

Add 方法的语法包含下面部分:

部分 描述
object 必需的。对象表达式,其值是“应用于”列表中的一个对象
relative 可选的。已存在的 Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。
relationship 可选的。指定的 Node 对象的相对位置,如设置值中所述。
key 可选的。唯一的字符串,可用于用 Item 方法检索 Node。
text 必需的。在 Node 中出现的字符串。
image 可选的。在关联的 ImageList 控件中的图像的索引。
selectedimage 可选的。在关联的 ImageList 控件中的图像的索引,在 Node 被选中时显示。


设置值

relationship 的设置值是:

常数 值 描述
tvwFirst 0 首的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之前。
tvwLast 1 最后的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后
tvwNext 2 (缺省)下一个节点。该 Node 位于在 relative 中被命名的节点之后。
tvwPrevious 3 前一个节点。该 Node 位于在 relative 中被命名的节点之前。
tvwChild 4 (缺省)子节点。该 Node 成为在 relative 中被命名的
节点的子节点。



注意 如果在 relative 中没有被命名的 Node 对象,则新节点被放在节点顶层的最后位置。

说明

Nodes 集合是一个基于 1 的集合。

在添加 Node 对象时,它被指派一个索引号,该索引号被存储在 Node 对象的 Index 属性中。这个最新成员的 Index 属性值就是 Node 集合的 Count 属性的值。

因为 Add 方法返回对新建立的 Node 对象的引用,所以使用这个引用来设置新 Node 的属性十分方便。以下例子添加几个具有相同属性的 Node 对象:

Dim nodX As Node '声明对象变量。
Dim I as Integer '声明计数器变量。
For I = 1 to 4
Set nodX = TreeView1.Nodes.Add(,,,"Node " & Cstr(i))
'使用引用来设置其它属性,如 Enabled。
nodX.Enabled = True
'把图像属性设置为在关联的 ImageList 中的图像 3。
nodX.ExpandedImage = 3
Next I

cBirdNO1NO1 2009-11-15
  • 打赏
  • 举报
回复
1、加载部件:Microsoft Windows Common Cotrol 6.0
2、控件TreeView的关键事件:NodeClick
3、控件TreeView的关键属性Nodes为一个对象Node的集合。可以实现结点的添加、删除操作。通过VB对象浏览器应该可以掌握该控件的使用方法。
KillClear 2009-11-15
  • 打赏
  • 举报
回复
银呢?没银知道?

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧