用户控件中有一个树,窗体使用了这个控件,但是重命名时执行node.text="XXXX" 执行了很长时间,大约9s,在此期间winform界面假死,尝试过多线程异步委托的方式来操作, 还是假死
再次单步调试,虽然树节点绑定了很多事件,但都是很快就执行完毕的,树是一次加载的,数据量比较大,大约7w个节点,用dot trace跟踪了一下,得到如下结果
-9,309ms System.Windows.Forms.TreeNode.set_Text(String) --9,309ms System.Windows.Forms.TreeNode.UpdateNode(Int32) ---9,309ms System.Windows.Forms.TreeView.ForceScrollbarUpdate(Boolean) ----9,309ms System.Windows.Forms.Control.SendMessage(Int32, Int32, Int32) -----[Native code]()
耗时还是在node.Text的set方法上,原来对树节点重命名涉及到界面更新,滚动条在大量数据下更新会很缓慢(话说重命名为什么更新滚动条,横向的吗?怎么这么慢?),如何解决呢? 尝试过隐藏树再更新、禁止重绘,设值,恢复重绘,还是不行,找来找去发现有2个解决方案:
1.实现自绘树,自己去实现树的绘制和界面更新
2.按需加载,节点在展开的时候清除所有子节点,讲响应节点挂到树上,收起时删除所有节点,并挂载一个空节点以显示+号响应下次展开事件
实际使用中我用的是第二个方法,第二个方法好处是标准控件,方便日后更新或升级,并且方法强大