【急】如何根据表格数据动态创建treeview节点

数据库数据表

img

通过SQL查询生成了一份数据表如图

img


在根据这个表自动生成目录树,达到常用数据的快速筛选查询,达到如下效果

img

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列的组合依次,代码如下,有帮助麻烦点个采纳【本回答右上角】,谢谢~~

img

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


运行后生成结果是这样的,不完整

img