fang0000fang 2021-09-05 13:08 采纳率: 100%
浏览 62
已结题

【急】如何根据表格数据动态创建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

思考过递归,但写了很久没写出来,后面用循环嵌套写,功能不完善,请各位指点迷津。

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2021-09-05 13:58
    关注

    可以考虑用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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月13日
  • 已采纳回答 9月5日
  • 创建了问题 9月5日

悬赏问题

  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效