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日

悬赏问题

  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本