列名
|
数据类型
|
描述
|
长度
|
主键
|
ID
|
Int
|
节点编号
|
4
|
是
|
ConText
|
Nvarchar
|
我们要显示的节点内容
|
50
|
|
ParentID
|
Int
|
父节点编号
|
4
|
|
Depth
|
Int
|
深度
|
4
|
|
CREATE TABLE [dbo].[tbTree] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Context] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ParentID] [int] NULL
) ON [PRIMARY]
SET IDENTITY_INSERT tbtree ON
insert tbtree (ID,Context,ParentID) values ( 1,'中国',0)
insert tbtree (ID,Context,ParentID) values ( 2,'北京',11)
insert tbtree (ID,Context,ParentID) values ( 3,'天津',1)
insert tbtree (ID,Context,ParentID) values ( 4,'河北省',1)
insert tbtree (ID,Context,ParentID) values ( 5,'广东省',1)
insert tbtree (ID,Context,ParentID) values ( 6,'广州',5)
insert tbtree (ID,Context,ParentID) values ( 7,'四川省',1)
insert tbtree (ID,Context,ParentID) values ( 8,'成都',7)
insert tbtree (ID,Context,ParentID) values ( 9,'深圳',5)
insert tbtree (ID,Context,ParentID) values ( 10,'石家庄',4)
insert tbtree (ID,Context,ParentID) values ( 11,'辽宁省',1)
insert tbtree (ID,Context,ParentID) values ( 12,'大连',11)
insert tbtree (ID,Context,ParentID) values ( 13,'上海',1)
insert tbtree (ID,Context,ParentID) values ( 14,'天河软件园',6)
insert tbtree (ID,Context,ParentID) values ( 15,'汕头',5)
SET IDENTITY_INSERT tbtree off
Dim CN As ADODB.Connection '定义数据库的连接
Dim Rs As ADODB.Recordset
'工程--->引用--->Microsoft ActiveX Data Object 2.x(版本号)
Private Sub Form_Load()
Set CN = New ADODB.Connection
‘连接数据库
CN.ConnectionString = "Provider=sqloledb;Data Source=pmserver;Initial Catalog=Benchmark;User Id=sa;Password=sa;"
CN.Open
Call AddTree(3)
End Sub
Private Sub AddTree(ByVal intDepth As Integer)
‘打开记录集,得到深度小于些深度的所有节点,并按深度排序
Set Rs = New ADODB.Recordset
Rs.Open "select * from tbTree where depth<='" & intDepth & "' order by depth", CN, adOpenDynamic, adLockReadOnly
Dim Xnod As Node
Do While Not Rs.EOF
If Rs.Fields("depth") = 0 Then
‘加入根结点
Set Xnod = TreeView1.Nodes.Add(, , "key" & Rs.Fields("id"), Rs.Fields("context"))
Else
‘加入子节点
Set Xnod = TreeView1.Nodes.Add("key" & Rs.Fields("parentid"), tvwChild, "key" & Rs.Fields("id"), Rs.Fields("context"))
End If
Xnod.EnsureVisible
Rs.MoveNext
Loop
Rs.Close
End Sub
CREATE PROCEDURE spGetTree (
@ID int)
as
set nocount on
declare @tmp table (Id int,ConText varchar(50),ParentID int,depth int)
insert @tmp select * from tbtree where ID=@ID
while exists(select 1 from tbtree a,@tmp b where a.ParentID=b.ID and a.ID not in (select ID from @tmp))
insert @tmp select a.* from tbtree a,@tmp b where a.ParentID=b.ID and a.ID not in (select ID from @tmp)
select * from @tmp
set nocount off
GO
Private Sub AddTreeEx(ByVal intID As Integer)
Set Rs = New ADODB.Recordset
Rs.Open "spGettree " & intID, CN, adOpenDynamic, adLockReadOnly
Dim Xnod As Node
Do While Not Rs.EOF
If Rs.Fields("parentID") = 0 Then
Set Xnod = TreeView1.Nodes.Add(, , "key" & Rs.Fields("id"), Rs.Fields("context"))
Else
Set Xnod = TreeView1.Nodes.Add("key" & Rs.Fields("parentid"), tvwChild, "key" & Rs.Fields("id"), Rs.Fields("context"))
End If
Xnod.EnsureVisible
Rs.MoveNext
Loop
Rs.Close
End Sub
在VB.NET中实现
Private ds As New DataSet ()
' AddTree递归函数每次都要用到数据集中的一个表,所以定义成private
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' '定义数据库连接
Dim CN As New SqlConnection()
Try
'初始化连接字符串
CN.ConnectionString = "data source=pmserver;initial catalog=Benchmark;persist security info=False;user id=sa;Password=sa;"
CN.Open()
'添加命令,从数据库中得到数据
Dim sqlCmd As New SqlCommand()
sqlCmd.Connection = CN
sqlCmd.CommandText = "select * from tbtree"
sqlCmd.CommandType = CommandType.Text
Dim adp As SqlDataAdapter = New SqlDataAdapter(sqlCmd)
adp.Fill(ds)
Catch ex As Exception
MsgBox(ex.Message)
Finally
'关闭连接
CN.Close()
End Try
'调用递归函数,完成树形结构的生成
AddTree(0, Nothing)
End Sub
'̀递归添加树的节点
Private Sub AddTree(ByVal ParentID As Integer, ByVal pNode As TreeNode)
Dim Node As TreeNode
Dim dvTree As New DataView()
dvTree = New DataView(ds.Tables(0))
'过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "PARENTID = " + ParentID.ToString
Dim Row As DataRowView
For Each Row In dvTree
If pNode Is Nothing Then '判断是否根节点
'̀添加根节点
Node = TreeView1.Nodes.Add(Row("context").ToString())
'̀再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
Else
‘添加当前节点的子节点
Node = pNode.Nodes.Add(Row("context").ToString())
'̀再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
End If
Node.EnsureVisible()
Next
End Sub
程序运行结果如下图所示:http://support.microsoft.com/default.aspx?kbid=311318
http://support.microsoft.com/default.aspx?kbid=308063
http://support.microsoft.com/default.aspx?kbid=317597
http://support.microsoft.com/default.aspx?kbid=244954