Winform中node.Text重命名时窗口无响应假死的解决方法

用户控件中有一个树,窗体使用了这个控件,但是重命名时执行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.按需加载,节点在展开的时候清除所有子节点,讲响应节点挂到树上,收起时删除所有节点,并挂载一个空节点以显示+号响应下次展开事件

实际使用中我用的是第二个方法,第二个方法好处是标准控件,方便日后更新或升级,并且方法强大

上一篇:CentOS-7.3.1611编译安装 Nginx-1.12.1+mysql-5.7.19+PHP-7.1.8+zabbix-3.4.1


下一篇:Dynamics CRM 产品视图列上自带按钮的隐藏