不用递归的TreeView构建方法(优化方案)

转载 2006年06月23日 10:39:00

高效的TreeView构建方法

 

网上一直有朋友说.net上的TreeView不够快,而且也不方便。那么真实的情况是否如此呢。我做的一项目中需要一个快速的Tree,它的数据源是MS SQL,其对应表中记录的结构如下:

ID

FatherID

Title

0101

01

基本建设支出

010109

0101

其它基本建设支出

其特点是父节点的ID正好是当前记录ID的长度-2所截取的字符串

因此我写下了如下代码:

一、普通的方法

Private Function BuildENTree(ByVal ds As DataSet)

        Dim rs As DataRowCollection

        Dim r As DataRow

        Dim ID As String

        Dim FatherID As String

        Dim Title As String

        Dim fn As TreeNode

        Dim node As TreeNode

 

        rs = ds.Tables(0).Rows

        BootNode = New TreeNode

        BootNode.Text = "[0] 所有单位"

        BootNode.Tag = "0"   '根目录

        treeEN.Nodes.Add(BootNode)

 

        For Each r In rs

            ID = DirectCast(r.Item(0), String).Trim   'CODE

            FatherID = DirectCast(r.Item(1), String).Trim 'FATHERCODE

            Title = "[" & ID & "] " & DirectCast(r.Item(2), String).Trim 'TITLE

            '查找与父节点ID相同的节点

            fn = FindNode(FatherID)

            If fn Is Nothing Then

                '没找到对应ID的节点

            Else

                node = New TreeNode

                With node

                    .Tag = ID

                    .Text = Title

                End With

                fn.Nodes.Add(node)

            End If

        Next

        BootNode.Expand()

End Function

 

'在指定的节点下查找ID相符节点

Private Function FindNode(ByVal n As TreeNode, ByVal ID As String) As TreeNode

        Dim ns As TreeNodeCollection

        Dim node As TreeNode

        Dim Flag As Boolean

        Dim strText As String

        Dim ReturnNode As TreeNode

 

        Flag = False

 

        If n.Tag = ID Then

            Return n

        Else

            '如果路径根本不相同则返回

            If (ID.Length < DirectCast(n.Tag, String).Length) OrElse ((n.Tag <> "0") AndAlso (ID.Substring(0, n.Tag.Length) <> n.Tag)) Then

                Return Nothing

            End If

 

            ns = n.Nodes

            For Each node In ns

                ReturnNode = FindNode(node, ID)

                If ReturnNode Is Nothing Then

                    'do nothing

                Else

                    Flag = True

                    Exit For

                End If

            Next

            If Flag = True Then Return ReturnNode

        End If

        Return Nothing

    End Function

 

以上的代码利用将当前字节点的ID值存储于Node的Tag中,然后从根目录开始进行遍历进行查找。运行后发现其效率极为低下。但是网上的代码大多如此。

有没有其它方法可以增快其运行速度呢。

神说:“算法要么以空间换时间,要么以时间换空间”。

在某个时候我于是顿悟了。我发现我可以.net提供的HashTable,这可是个好东东。

那么如何来使用它呢?

 

二、快速的方法

首先我们需要增加一个定义

Private FastHashTable As Hashtable

然后需要将BuildENTree来做点小调整

    Private Function BuildENTree(ByVal ds As DataSet)

        Dim rs As DataRowCollection

        Dim r As DataRow

        Dim ID As String

        Dim FatherID As String

        Dim Title As String

        Dim fn As TreeNode

        Dim node As TreeNode

 

        rs = ds.Tables(0).Rows

        BootNode = New TreeNode

        BootNode.Text = "[0] 所有单位"

        BootNode.Tag = "0"   '根目录

        treeEN.Nodes.Add(BootNode)

        FastHashTable.Add("0", BootNode)

 

        For Each r In rs

            ID = DirectCast(r.Item(0), String).Trim   'CODE

            FatherID = DirectCast(r.Item(1), String).Trim 'FATHERCODE

            Title = "[" & ID & "] " & DirectCast(r.Item(2), String).Trim 'TITLE

            '查找与父节点ID相同的节点

            fn = FindNode(FatherID)

            If fn Is Nothing Then

                '没找到对应ID的节点

            Else

                node = New TreeNode

                With node

                    .Tag = ID

                    .Text = Title

                End With

                fn.Nodes.Add(node)

                FastHashTable.Add(ID, node)

            End If

        Next

        BootNode.Expand()

    End Function

从以上代码看出,我只是增加了两处黑体的代码,它的作用就是将新增的节点不仅存到TreeView中,还要存到FashHashTable中,其关键字是ID值,只要没有重复的ID,那么就可以使用。

接下来我们还需要对FindNode进行改变。

    '新版的快速查找

    Private Function FindNode(ByVal ID As String) As TreeNode

        Return FastHashTable.Item(ID)

End Function                               

好了,现在还有一个工作要做,就是要将FastHashTable进行初使化,尽量将其初使化成与你将要构建的数据节点数相同,我这个系统中是3000个节点,因此我增加了以下一句:

FastHashTable = New Hashtable(3000) '数量

现在,这个树已经很快了。

三、后记

即使是在.net时代,数据结构对我们也是很有用的。今天就到这儿吧!

 

递归(Recursion)的两种优化方法

递归(Recursion)的两种优化方法最近学习了一些递归的优化方法,于是想写一篇文章记录一下,方便以后查看,并想分享一下。 虽然平日的上课中老师都是建议我们不要使用递归,但是在函数式编程(func...
  • HEYUJIEBOY
  • HEYUJIEBOY
  • 2017年08月04日 20:03
  • 494

c# treeview 递归生成树

private void InitTree(TreeNodeCollection Nds, string pid, DataTable dt, string id, string name, stri...
  • love_rrr
  • love_rrr
  • 2009年10月19日 17:04
  • 2261

递归实现treeview应用的方法

#region 绑定TreeView         ///         /// 绑定TreeView(利用TreeNode)         ///         ///TreeN...
  • u012162153
  • u012162153
  • 2014年11月20日 12:01
  • 798

递归优化

fact(n)用递归的方式写出来就是: def fact(n): if n==1: return 1 return n * fact(n - 1)递归函数的优点是定义...
  • xad707348125
  • xad707348125
  • 2015年06月02日 14:47
  • 505

Treeview的递归绑定

1using System;  2using System.Collections;  3using System.ComponentModel;  4using System.Data;  5usi...
  • wszhoho
  • wszhoho
  • 2007年03月22日 17:36
  • 593

.net的TreeView控件绑定数据库表建立树架构

net本身自带的TreeView控件本身可以提供简单快捷的树结构控件,不过需要是在前台界面手动输入静态数据,只能预先设定好值,一一录入。这次使用到的方法是通过在后台代码绑定数据库表,实现动态的数据树显...
  • Annn_kk
  • Annn_kk
  • 2017年04月17日 14:41
  • 371

TreeView数据绑定的方法(可实现无限递归)

数据表为:CREATE TABLE [dbo].[QuHua] ( [ID] [int] IDENTITY (1, 1) NOT NULL ,--自增的标记列 [NAME] [varchar] (50...
  • zhanxiangma
  • zhanxiangma
  • 2010年12月28日 15:05
  • 813

数据库sql常见优化方案

为什么要优化:      随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能 会有一些差异,这时我们就需要做一个优化调整。 数据库优化这个课题较大,可分为四大类...
  • miachen520
  • miachen520
  • 2016年08月24日 14:54
  • 1616

TreeView 递归添加子节点

此问题来自论坛,实现TreeView递归添加接点的主要思路是,数据表的设计,数据表应该有三个字段:"NodeID","Name",和"ParentID".using System;using Syst...
  • baihe_591
  • baihe_591
  • 2008年05月17日 16:27
  • 2990

TreeView控件的加载,遍历递归的应用

       看了许多TREEVIEW的使用方法,发现没有一个适合初次接触.NET中的TREEVIEW的例子,由于以前在VB6中加载TREEVIEW的结构树很简单,只是一个ADD()方法而已,在方法中...
  • yumanqing
  • yumanqing
  • 2006年10月12日 11:44
  • 2110
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不用递归的TreeView构建方法(优化方案)
举报原因:
原因补充:

(最多只允许输入30个字)