vb treeview?关于VB中TreeView控件使用样例
在这个信息爆炸的时代,了解vb treeview和关于VB中TreeView控件使用样例的重要性不言而喻。本文将为您带来全面的解读,助您在这个领域中游刃有余。
VB中如何使用TreeView控件.
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
VB中单击treeview结点在listview显示(数据库)
分类:电脑/网络>>程序设计>>其他编程语言
问题描述:
treeview连接数据库,单击treeview结点(treeview结点在数据库中有),当单击treeview结点查找数据库中另外一个表中的数据时,把查找到数据在listview中显示。
解析:
你找到node(即接点)的相关属性就是什么呢?反正找到就可以了,然后在treeview的nodeclick事件中写上以下代码:listview.datasource=treeview.node.text,就可以了。
关于VB中TreeView控件使用样例
按照里面的SUB相应地添加控件.
如果满意我们回答,请采纳.谢谢
Option Explicit
Dim I As Integer
Dim J As Integer
Dim nodx As Node
Dim CunZai As Boolean'定义变量
Private Sub Command1_Click()
If txt(0).Text<>"" And txt(1).Text<>"" Then'不允许建立零字节的父节点和子节点
CunZai= False
J= TreeView1.Nodes.Count
For I= 1 To TreeView1.Nodes.Count'检查新输入的父节点名称是否存在
If TreeView1.SelectedItem.Children> 0 Then
If txt(0).Text= TreeView1.Nodes(I).Text Then CunZai= True
End If
Next I
If CunZai= True Then'若存在,则在父节点下建立子节点
Set nodx= TreeView1.Nodes.Add(txt(0).Text, tvwChild,"child"& J, _
txt(1).Text, 3)
Else',若不存在,则建立父节点和子节点
Set nodx= TreeView1.Nodes.Add(,, txt(0).Text, txt(0).Text, 1)
Set nodx= TreeView1.Nodes.Add(txt(0).Text, tvwChild,"child"& J, _
txt(1).Text, 3)
End If
TreeView1.Refresh
ElseIf txt(0).Text="" Then MsgBox"请输入父节点名称!", vbInformation,"警告!"
'系统提示
ElseIf txt(1).Text="" Then MsgBox"请输入子节点名称!", vbInformation,"警告!"
End If
End Sub
Private Sub Command2_Click()
For I= 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded= True'展开所有节点
Next I
End Sub
Private Sub Command3_Click()
For I= 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded= False'收起所有节点
Next I
End Sub
Private Sub Command4_Click()
TreeView1.Sorted= True'排列顺序
End Sub
Private Sub Command5_Click()
If TreeView1.SelectedItem.Index<> 1 Then
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index'删除选定的节点
End If
End Sub
Private Sub Command6_Click()
End'退出程序
End Sub
Private Sub Form_Load()
TreeView1.LineStyle= tvwTreeLines'在兄弟节点和父节点之间显示线
TreeView1.ImageList= ImageList1'链接图像列
TreeView1.Style= tvwTreelinesPlusMinusPictureText
'树状外观包含全部元素
Set nodx= TreeView1.Nodes.Add(,,"aaaaa","aaaaa", 1)
'建立名称为"aaaaa"的父节点,选择索引为1的图像
Set nodx= TreeView1.Nodes.Add("aaaaa", tvwChild,"child01","收件箱", 3)
'在"aaaaa"父节点下建立"收件箱"子节点,选择索引为3的图像
Set nodx= TreeView1.Nodes.Add("aaaaa", tvwChild,"child02","发件箱", 3)
'在"aaaaa"父节点下建立"发件箱"子节点,选择索引为3的图像
CunZai= False
End Sub
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
Node.ExpandedImage= 2'节点被展开时,选择索引为2的图像
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
If TreeView1.SelectedItem.Children= 0 Then'检查是否有子节点,0为无
For I= 1 To TreeView1.Nodes.Count
If TreeView1.Nodes(I).Selected Then
MsgBox"您选择的是:“"& TreeView1.Nodes(I).FullPath&"”子节点!"
'系统提示
End If
Next I
End If
End Sub
关于vb treeview的内容到此结束,希望对大家有所帮助。