[讨论]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)判断是不是文件夹
如果是的话 就在他下边增加一个东西 但是要标记
这样前边就有+了
当你点机这个东西时候 你在 手搜索下边的东西 添加上去 在把你天的那个拿掉