数据库数据表
通过SQL查询生成了一份数据表如图
Private Sub creat_tree()
Dim parentNode As TreeNode = Me.MLTREE_TreeView.Nodes.Add("Q_M_ATREE", DA_TYPETreeView.SelectedNode.Text & "(目录树)") '生成根节点
Dim Tables As New DataTable("mytables")
mydataset = New DataSet
'查询数据库,查询字段根据用户设置生成
SQL_STR = "SELECT " & GDML_TREE_str(0) & " ," & GDML_TREE_str(1) & "," & GDML_TREE_str(2) & "," & GDML_TREE_str(3) & " FROM [sddazh].[dbo].[T_GDDA_GDFILE] WHERE ARCHIVE_TYPE_ID='" & DA_TYPE & "' AND IS_DELETE=0 group by " & GDML_TREE_str(0) & "," & GDML_TREE_str(1) & "," & GDML_TREE_str(2) & "," & GDML_TREE_str(3) & " having count(" & GDML_TREE_str(2) & ")>0 " 'order by cast([FOND_CODE]as int),[vchar_1],[YEAR_CODE]"
mydataset.Tables.Add(Tables)
con.ConnectionString = My.Settings.sddazhConnectionString
Adapter = New SqlDataAdapter(SQL_STR, con)
Adapter.Fill(Tables)
MYFOLDER_DV = New DataView(Tables)
'创建节点
If MYFOLDER_DV.Count > 0 Then
'行循环
For Each rr As DataRowView In MYFOLDER_DV
Dim nodeId As String = "" '用于存储节点名称name
'列循环,即查询字段数,也就是treeview的节点深度
For i As Integer = 0 To GDML_TREE_str.Length - 1
Dim NewNode As TreeNode = New TreeNode
nodeId = nodeId & rr.Item(GDML_TREE_str(i))
NewNode.Text = rr.Item(GDML_TREE_str(i))
NewNode.Name = nodeId
NewNode.Tag = nodeId
If parentNode.Nodes.ContainsKey(NewNode.Name) = False Then '判断节点name是否存在
parentNode.Nodes.Add(NewNode)
parentNode = NewNode
Else
parentNode = NewNode '如果存在,把此节点作为父节点
End If
Next
parentNode = MLTREE_TreeView.Nodes(0) ' 返回根节点
Next
End If
End Sub
思考过递归,但写了很久没写出来,后面用循环嵌套写,功能不完善,请各位指点迷津。
可以考虑用dictionary记录每个父节点对应的节点,不存在就创建,key为前3列的组合依次,代码如下,有帮助麻烦点个采纳【本回答右上角】,谢谢~~
Imports System.Data
Imports System.Collections.Generic
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim data As DataTable = New DataTable
data.Columns.Add("全宗号")
data.Columns.Add("分类号")
data.Columns.Add("年度")
data.Columns.Add("期限")
data.Rows.Add("100", "A", "2016", "30年")
data.Rows.Add("100", "A", "2016", "永久")
data.Rows.Add("100", "G", "2016", "30年")
data.Rows.Add("100", "G", "2017", "永久")
data.Rows.Add("101", "A", "2016", "30年")
data.Rows.Add("101", "A", "2016", "永久")
Dim kv As Dictionary(Of String, TreeNode) = New Dictionary(Of String, TreeNode)
Dim key0, key1, key2 As String
'Dim pNode As TreeNode
Dim parentNode As TreeNode = Me.TreeView1.Nodes.Add("Q_M_ATREE", "文书档案(目录树)")
Dim node As TreeNode
For Each row In data.Rows
key0 = row(0).ToString()
key1 = row(0) & "-" & row(1)
key2 = row(0) & "-" & row(1) & "-" & row(2)
If Not kv.ContainsKey(key0) Then '1级节点
node = New TreeNode
node.Text = row(0).ToString()
parentNode.Nodes.Add(node)
kv.Add(key0, node)
End If
If Not kv.ContainsKey(key1) Then '2级节点
node = New TreeNode
node.Text = row(1).ToString()
kv(key0).Nodes.Add(node)
kv.Add(key1, node)
End If
'添加3级节点
If Not kv.ContainsKey(key2) Then '2级节点
node = New TreeNode
node.Text = row(2).ToString()
kv(key1).Nodes.Add(node)
kv.Add(key2, node)
End If
'4级节点
node = New TreeNode
node.Text = row(3).ToString()
kv(key2).Nodes.Add(node)
Next
End Sub
End Class
运行后生成结果是这样的,不完整