首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

[讨论]TreeView控件:加载大量数据时,运行速度的有关问题

2012-02-27 
[讨论]TreeView控件:加载大量数据时,运行速度的问题!做一个类似Windows资源管理器左边的树型菜单,需要遍历

[讨论]TreeView控件:加载大量数据时,运行速度的问题!
做一个类似Windows资源管理器左边的树型菜单,需要遍历硬盘中所有文件夹,然后用TreeView控件绑定每一个文件夹及子文件夹以及文件夹中的文件(每一个节点绑定一个文件夹名或文件名,树节点的层次结构和文件夹的层次一样),我使用递归遍历硬盘中的文件夹,然后绑定到节点。

如图:
---------------------------------------------------
-我的电脑
    -C:[WinXp]
        +Documents   and   Settings
        -Program   Files
              +Common   Files
              +ComPlus   Applications
              +Internet   Explorer
              +Microsoft   ActiveSync
              +Movie   Maker
        +Windows
    -D:[软件]
        +Microsoft   SQL   Server
        -Winamp5.0.1
              +.dll
              +Theme
              -Skins
                  +Skin1
                  +Skin2
                  +Skin3
        +Adobe
              +Acrobat   7.0
              +Photoshop   7.0
              +Flash8.0
        +Microsoft   Office
        +Microsoft   Visual   Studio   8
    -E:[娱乐]
        +Mp3
            +流行经典
            +外国歌曲
                  +摇滚
                  +爵士
                  +乡村音乐
            +港台歌手
                  +刘德华
                  +张学友
                  +谭咏麟
                  +周杰伦
                  +邓丽君
                  +梁咏琪
            +大陆歌手
        -电影
              + <李连杰> 专辑
              + <周星驰> 专辑
              + <成龙> 专辑
                    +A计划
                    +红番区
                    +龙少爷
                    +尖峰时刻
                    +宝贝计划
        +游戏
              +魔兽争霸
              +帝国时代
              +CS1.6
              +小游戏


                    +搞怪碰碰球
                    +经典街机游戏
                    +连连看
                    +拼图游戏
------------------------------------------------    
程序做是做出来了,但是程序启动时很慢,我估计了一下,绑定TreeView控件大概需要20s左右的时间(我的电脑配置:主频2.66G,512M内存,120G硬盘),那太夸张了吧...

对于这个问题,我的另一个想法是,在TreeView控件加载数据时只夹在第一层的数据,即最初只加载几个驱动器盘符,然后点击驱动器节点时,再加载该驱动器下面包含的文件和文件夹,以后各层文件夹使用同样的方法来加载子文件和子文件夹,但是程序实现起来要比我之前的程序要复杂。(主要是要判断某一个文件夹是否包含有文件以及子文件夹,以确定该文件夹前面的符号是否是 "+ "号)

想请教各位,还有什么更好的解决方案没有?欢迎拍砖~~~~~~~~~~~~

[解决办法]
参看csdn的tree,梅花雪出品
[解决办法]
刚开始不要全部展开啊
[解决办法]
学习
[解决办法]
一次性 将所有的 数据 导入到页面 肯定会慢
楼主可以使用 ajax部分加载 就像CSDN论坛的树一样 点击 一个节点 再加载其下的节点数据
ajax和c#.net相结合的树型菜单
http://blog.csdn.net/zdyguilong/archive/2007/02/07/1504549.aspx
[解决办法]
这个不太清楚了、、、
[解决办法]
“System Volume Information”文件夹,中文名称可以翻译为“系统卷标信息”。这个文件夹里就存储着系统还原的备份信息。
[解决办法]
像 csdn是的,动态加载呀
[解决办法]
对呀,你可以不全部展开
[解决办法]
我的一个分区的目录数在10w-20w个,几乎感觉不到延时,这个数量级应该不会比你那边少吧?

Imports System.IO

Module Module1
Private testList As TestCtrl

Private myFrm As Form
Private myTree As TreeView

Private Sub TreeClicked(ByVal sender As Object, ByVal e As System.EventArgs)
Dim tmpTree As TreeView = sender
Dim ex As MouseEventArgs = e
Dim actNode As TreeNode = tmpTree.GetNodeAt(ex.X, ex.Y)

If (actNode IsNot Nothing) Then
If (actNode.IsExpanded()) Then
If (actNode.Tag() = "Loaded ") Then
actNode.Expand()
Else
Dim i As Integer = 1
Dim strParentPath As String = actNode.Text()
Dim tmpNode As TreeNode = actNode.Parent()

While (tmpNode IsNot Nothing)
If (tmpNode.Text().EndsWith( "\ ")) Then
strParentPath = tmpNode.Text() + strParentPath
Else
strParentPath = tmpNode.Text() + "\ " + strParentPath
End If

tmpNode = tmpNode.Parent()
End While

If (Not strParentPath.EndsWith( "\ ")) Then
strParentPath = strParentPath + "\ "
End If

i = 0
While (i < actNode.Nodes.Count())
testList.SetCurrentRoot(strParentPath + actNode.Nodes.Item(i).Text() + "\ ")
testList.BrowserCurrentRoot(myTree, actNode.Nodes.Item(i))
i = i + 1
End While



actNode.Tag = "Loaded "
End If
End If
End If
End Sub

Public Sub Main()
testList = New TestCtrl( "D:\ ")

myFrm = New Form()
myTree = New TreeView()

myFrm.Width = 400
myFrm.Height = 600

myTree.Left = 0
myTree.Top = 0
myTree.Width = 396
myTree.Height = 576

AddHandler myTree.Click, AddressOf TreeClicked

testList.BrowserCurrentRoot(myTree, Nothing)

myFrm.Controls.Add(myTree)

myFrm.ShowDialog()
End Sub

Public Class TestCtrl
Inherits System.Windows.Forms.Form

Private strRoot As String = " "

Public Sub New(ByVal strRootDir As String)
Me.strRoot = strRootDir
End Sub

Public Sub SetCurrentRoot(ByVal newRoot As String)
Me.strRoot = newRoot
End Sub

Public Sub BrowserCurrentRoot(ByVal myTree As TreeView, ByVal tmpNode As TreeNode)
If (Me.strRoot.Length() = 0) Then
Exit Sub
End If

Try
Dim myDir As New DirectoryInfo(Me.strRoot)
Dim subDirs As DirectoryInfo() = myDir.GetDirectories()

If (subDirs.Length() > 0) Then
If (myTree.Nodes.Count() = 0) Then
myTree.Nodes.Add(Me.strRoot)
End If

If (tmpNode Is Nothing) Then
tmpNode = myTree.Nodes.Item(0)
End If

Dim i As Integer = 0
While (i < subDirs.Length())
tmpNode.Nodes.Add(subDirs(i).FullName().Replace(Me.strRoot, " "))
i = i + 1
End While
Else
If (myTree.Nodes.Count() = 0) Then
myTree.Nodes.Add(Me.strRoot)
End If
End If
Catch ex As System.Exception

End Try
End Sub
End Class
End Module

[解决办法]
学习 帮顶
[解决办法]
一个建议
你遍历到本层的时候 通过System.IO.Directory.Exists(filepath)判断是不是文件夹
如果是的话 就在他下边增加一个东西 但是要标记
这样前边就有+了

当你点机这个东西时候 你在 手搜索下边的东西 添加上去 在把你天的那个拿掉

热点排行