绑定时,我得到了一个包含太多元素的TreeView 。它非常快,因为我使用 beginUpdate 和 endUpdate,但是当我说
treeView.beginUpdate();
treeView.items.clear();
treeView.endUpdate();
它与我添加时的效率不同。当我清除所有项目时,需要很长时间并且不会暂停 UI。
绑定时,我得到了一个包含太多元素的TreeView 。它非常快,因为我使用 beginUpdate 和 endUpdate,但是当我说
treeView.beginUpdate();
treeView.items.clear();
treeView.endUpdate();
它与我添加时的效率不同。当我清除所有项目时,需要很长时间并且不会暂停 UI。
如果 Nodes 集合有 200 多个项目,则 Clear() 方法会自动调用 BeginUpdate() 和 EndUpdate() 方法,这就是您可能没有真正注意到任何差异的原因。
然而,这对您没有多大帮助,因为 Clear() 方法所做的是它遍历整个树并删除所有子节点,这当然需要很多时间。不幸的是,Nodes 属性是只读的,因此您不能只初始化 TreeViewNodeCollection。
重新创建 TreeView 控件 - 正如 Daro 所建议的那样 - 可能是一个可行的选择,因为它非常快,但是它似乎不会立即释放内存(调用 Dispose() 当然会再次遍历所有节点)。我通过强制垃圾收集对其进行了测试,它确实清理了它,这意味着它迟早会被自动清理掉。
SuspendLayout();
Controls.Remove(treeView1);
treeView1 = new TreeView();
treeView1.Location = new Point(39, 39);
treeView1.Size = new Size(213, 210);
Controls.Add(treeView1);
ResumeLayout();
Try collapsing the TreeView first (assuming not all nodes are at the top level):
treeView.beginUpdate();
treeView.items.CollapseAll();
treeView.items.clear();
treeView.items.endUpdate();