使用镶套过程填充TreeView
经常需要从数据库中读取组织架构这类树形结构的数据,然后将它显示在TreeView中。下面是一个例子:
首先准备组织结构数据,必须包括如下字段
上级 | 序号 | 简称 |
-1 | 0 | XX公司 |
0 | 1 | 行政部 |
0 | 2 | 财务部 |
0 | 3 | 市场部 |
0 | 4 | 企划部 |
0 | 5 | 电脑部 |
0 | 6 | 客服部 |
0 | 7 | A品牌事业部 |
0 | 8 | B品牌事业部 |
0 | 9 | C品牌事业部 |
7 | 10 | 华东区 |
7 | 11 | 华南区 |
7 | 12 | 华中区 |
8 | 13 | 华东区 |
8 | 14 | 华南区 |
8 | 15 | 华中区 |
9 | 16 | 华东区 |
9 | 17 | 华南区 |
9 | 18 | 华中区 |
然后再from_load中调用LoadDepartment函数装载组织架构
dim cnn as new System.Data.oledb.oleDbConnect
dim adp as new System.Data.oledb.oleDbDataAdapter
cnn.ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="
+ Application.StartupPath + "/data/DB.mdb;Mode=Share Deny None;"
cnn.Open()
adp.SelectCommand.Connection = cnn
myTreeView.Nodes.Add("XX公司")
LoadDepartment(0, myTreeView.Nodes(0))
cnn.Close()
......
Private Sub LoadDepartment(ByVal currentid As Integer, ByVal parentNode As TreeNode)
cmd.CommandText = "SELECT 上级, 序号, 简称 FROM Departmentlist WHERE (((Departmentlist.上级)=" + currentid.ToString + "));"
Try
Dim ds As New Data.DataSet
adp.Fill(ds, "DepartmentList")
Dim i As Integer
For i = 0 To ds.Tables.Item(0).Rows.Count - 1
Dim myNode As TreeNode = New TreeNode(ds.Tables.Item(0).Rows(i)(2))
parentNode.Nodes.Add(myNode)
' 填充下一级
LoadDepartment(ds.Tables.Item(0).Rows(i)(1), myNode)
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
这样就可以了。如果需要调整树的结构,例如实现移动节点,只需要添加相应的移动代码,数据库中修改被移动节点的上级就可以了。这样数据结构的一个好处就是不用关心移动某一节点是他的下级编号是否要跟着调整。每个节点的序号只要不重复就可以了。如果想对节点进行排序可能就麻烦一些,需要在数据库中添加一个表示顺序的序号,并且移动节点是还要维护好这个序号。