查了好多资料,可是找不到啊。由于TreeVeiw节点可能要不断增加,并且节点数量有可能到百万级,越到后面就显示越慢,有什么方法或控件可以解决这个问题么?

解决方案 »

  1.   

    遇到过这样的问题,解决办法是,只有点到某个节点的时候再加载它的下一级节点,类似windows的资源管理器
      

  2.   

    那干吗非要用树啊?用Grid也可以啊
      

  3.   

    你的节点信息保存在哪里?添加节点的时候先保存信息,需要显示的时候再在树中进行构建,另外在构建节点的时候使用TreeView1.Items.BeginUpdate;
    ...//添加节点
    TreeView1.Items.EndUpdate;
      

  4.   

    回楼上的,要实时显示,用了BeginUpdate,就不能实时显示了。
      

  5.   

    我的意思是在添加节点的时候使用BeginUpdate,添加后使用EndUpdate
      

  6.   

    参考注册表的结构
    赞成先保存节点信息,再用BeginUpdate/EndUpdate动态构建
      

  7.   

    你做一个上百万的for循环,你看看需要多长时间,要是在程序运行的时候加载所有节点你做的效率再高也是需要很长时间,表面上看树只是添加了一个节点,其实内部构造有很多细节,你仔细考虑一下吧
      

  8.   

    楼主试试Virtual TreeView吧,速度超快。它采用了延迟加载的思想,你看看看DEMO就知道了。
    http://www.soft-gems.net/
      

  9.   

    Virtual TreeView我之前也找过,不过好像不大好用哦,每次添加节点都要在事件中添加,由于程序已经写好了,所以不想改动这么大,非常感谢大家的热心帮助。
      

  10.   

    如果不是回答问题,纯粹是为了灌水,那么上CSDN也没有意义。:)
      

  11.   

    遇到过这样的问题,解决办法是,只有点到某个节点的时候再加载它的下一级节点,并且用上BeginUpdate/EndUpdate
      

  12.   

    你用treeview显示的数据是树形结构的吗(结点下面,有子点的)
      

  13.   

    回楼上的,看不看到不重要,反正只要有数据就会添加。楼主,你这句话是关键!因为看到和看不到,对性能影响是大大不同的。看不到的,你就不用画出来。virtual tree,你爱怎么处理怎么处理,甚至你都不用往tree里面真的插入。
      

  14.   

    大型树是可以存在磁盘上的,等到它要显示的时候才去磁盘找,virtual tree就是这么实现的。
    你可以在GetNode的时候再去数据库中把要的信息查出来生成节点给它。
      

  15.   

    你要测试的是什么呢?是测试利用treeview的显示速度吗?
      

  16.   

    如果你一定要这样做,建议你用好好研究并深刻理解VirtualTree的机制。其实标准的TTreeView也可以用Vritual方式,其原理也是一样的。想想Windows的资源管理器(TTreeView)如何显示磁盘上成千上万的文件夹?
      

  17.   

    回楼上,VirtualTree的机制在哪找啊?看VirtualTreeView源码么?这个不是一个好主意。
    Windows的资源管理器就算显示成千上万的文件夹,它也是固定的,而且可以根据点击再搜索。
    而我目前做的是测试工具,并不是zxf_feng所说要“测试利用treeview的显示速度”,而是需要实时显示,实时显示的意思就是不断变化,不断添加。
      

  18.   

    既然是测试你选择treeview这样的工具可能本身就是一个错误,要测试你可以采用日志输出的方式来显示啊,该说的都已经说了,应该没有再好的方法了
      

  19.   

    回楼上,用TreeView显示也不是我选的:(
    多谢大家的支持!
      

  20.   

    回楼上,不是一下就百万级,是慢慢增加的。越到后面越慢,应该与内存也有关。
    ============================
    直接用TTreeView不用API那么添加每个节点的时间与 Count的Count次方成正比(这还不考虑内存切换)
    用Windows API可以保证添加每个节点的时间是常量(不考虑内存切换)
      

  21.   

    回My_Love ,你是说用API添加节点而不是TreeView.Items.Add?
      

  22.   

    http://www.meizz.com/Web/Web.asp
    建议LZ看看,这里面有个示例,我当时用微软的树控件慢的要死,我的数据也在5000条以上,
    用了梅花雪网站提供的方法速度非常快!
      

  23.   

    To Tzjz:
      好好考虑大家的建议,不要只是一味的否定。  标准的TreeView可以实现VirtualTreeView的效果,参考Delphi的Demo:Virtual Listview,虽然是介绍ListView的,但TreeView类似  你直接显示,是把数据保存在TreeView中了,自己不用保存数据了,虽然简单,但结点多时,速度奇慢,
      这是因为TreeView保存的数据不光是你的数据,还会附加了很多东西,直接吃掉了大量的内存(至少几十M,多则几百M,甚至上G),导致不光你的程序慢,连整个系统都会很慢  这么大量的数据,你得用合适的数据结构解决,而且不能保存全部数据到内存,应该需要保存到硬盘(为了加快速度,可以实用类似Cache的方法,减少硬盘读写次数)
      当然用数据库实现可以避免这些复杂的东西,但需要测试,因为数据库采用的一种通用结构,效率肯定比专门针对这个问题的优化的效果差  屏幕的大小是有限的,Virtual TreeView只是访问需要显示的数据,再显示,这样就避免了在内存中保存大量数据,运行速度关键取决于你搜索数据的速度  至于你提到的实时显示不是问题,你仔细思考一下 Virtual TreeView的原理就会明白。  不要怕复杂,这个问题本身就不简单,不可能像你想象的可以很简单解决!
      

  24.   

    to tzjz:
       你要用TreeView测试什么?需要写1百万条数据?
      

  25.   

    对了,有简单方法,你用IBM的深蓝II去运行你这个程序,一定很快,程序都不用改