• 树形结构深入分析


    最近一直在参加公司的一个软件设计的项目,因为目前还是以实习生的名义进来的,所以任务不大,就是一个小窗体的设计,不过和TreeView控件打交道打的比较多,对于树形结构的递归遍历算法也有所研究了,在这里晒一下自己的第一个正式设计的项目吧!

             开始,从数据中读取数据这个数据就不用说了吧,虽然是学C#的,不过公司要求要用VB来编写,代码附上:

    Public Sub BindTree(ByVal tn As TreeNode)

            Dim str As String = tn.Tag(1)

            Dim myConn As SqlConnection = db.getConnection() '得到数据库的链接

            Dim table As DataTable = db.GetSonNode(str, myConn) '由数据库帮助类得到子节点

            If table.Rows.Count = 0 Then

                tn.ImageIndex = 0

                Return

            End If

            For index As Integer = 0 To table.Rows.Count - 1

                Dim node As New TreeNode

                node.Text = table.Rows(index)("编码").ToString()

                node.Name = table.Rows(index)("序号").ToString()

                node.Tag = table.Rows(index)

                node.ImageIndex = 1

                tn.Nodes.Add(node)

                If table.Rows(index)("父编码").ToString().Length = 0 Then

                    Return

                Else

                    BindTree(node)

                End If

            Next

    End Sub                                    

    这是在下编写的递归算法,当然这是一个很常见的递归算法,相信大家都很容易理解,也易懂,不过如果各位有更好的想法的话,不如一起交流交流也不错啊,呵呵···就当抛砖引玉了。

    不过此次对TreeView的操作里面,这当然不是关键,有一个关键的地方就是开始经理和我说的那个,如何去实现凡是带子节点的节点和没有子节点的节点的图标不一致的问题。

    开始,我只是单纯的初始化设置了node.ImageIndex1或者为0,不过后来发现,在点击控件的时候,你看不到ImageIndex的改变,却在控件中的显示中悄悄的发生了变化,开始有点不懂,后来才知道,选择的节点必须经过另一项设置之后才会使其保持不变,就是在节点选择后的事件中添加以下这样一条语句:TreeView1.SelectedNode.SelectedImageIndex = 1,这样才能保持图标的不变。

    关键点二:我们只知道遍历循环整个树,就是从数据库中读取整个数据表,然后进行遍历。那么如何在已有的树形结构中对某一个节点进行遍历得到其所有子节点呢?注意是所有子节点,所以在此又要写一个遍历算法。(当然只是我只想到了这样一个办法,肯定有更优解,代码如下:)

      If tnode.Nodes.Count = 0 Then

                Return

            End If

            Dim table As DataTable

            Dim str As String = tnode.Tag(1)

            Dim myConn As SqlConnection = db.getConnection()

            table = db.GetSonNode(str, myConn)

            mydataset.Tables.Add(table)

            For i As Integer = 0 To tnode.Nodes.Count - 1

                GetAllSonNode(tnode.Nodes(i))

            Next

    首先声明一下,在此之前呢,我是先定义了一个全局的数据集mydataset。如果各位有更好的想法,多多交流吧!抛砖引玉,仅此而已!

  • 相关阅读:
    Bzoj1072--Scoi2007排列perm
    Bzoj1041--Haoi2008圆上的整点
    Bzoj3932--Cqoi2015任务查询系统
    HDU 1024 Max Sum Plus Plus(DP)
    HDU 1029 Ignatius and the Princess IV
    【noip模拟题】数列
    Hello World
    vue-router 进阶
    vue2.0 源码解读(二)
    vue2.0 源码解读(一)
  • 原文地址:https://www.cnblogs.com/zjw112/p/2111735.html
Copyright © 2020-2023  润新知