Winforms TreeView控件中,当加载38万个节点,甚至Begin&EndUpdate都无效时,如何加速TreeNode文本和颜色变化?

问题描述 投票:0回答:2

我有一个 TreeView,有 380k 个节点。我使用 TreeView.BeginUpdateTreeView.EndUpdate 来填充它,但后来我需要修改某些节点文本和颜色。我尝试在没有 Begin&EndUpdate 的情况下执行此操作,我尝试使用 Begin&EndUpdate 执行此操作,但它仍然很慢(大约需要 15 秒刷新)。这样几乎不可能执行分配的任务(我需要一个接一个地修改很多节点)。

我读了很多关于 TreeView 速度慢的相同问题,但这一切都以 “使用 Begin&EndUpdate” 甚至 “切换 TreeView.Visible 状态” 结束,但这一切都没有帮助。还能做什么?

现在我正在考虑在 Dictionary text2img 中缓存绘制的节点图像,但我不明白需要重写什么才能获取该图像。我所看到的只是能够更改 TreeView.DrawMode 并订阅 DrawNode 事件,但我不想自己绘制节点,我只想缓存它们并将缓存的图像提供给重绘它们的代码,这样慢慢地。节点颜色取决于正在更改的节点文本(更改的节点为绿色)。但也许,这是错误的方式。

c# .net winforms treeview
2个回答
1
投票

为了获得良好的性能,您绝对需要“虚拟化”,这意味着您不会在树中创建任何节点,直到它们实际显示为止。这应该会将昂贵的 UI 对象的数量从 380k 减少到几百个左右。不幸的是,我在 winforms 树视图的文档中看不到任何有关虚拟化的内容。所以可能只是不支持。

一种选择是使用支持虚拟化的 WPF 树视图。请参阅如何提高树视图性能如何在 winforms 中使用 WPF 控件

另一个选择是重新考虑呈现数据的方式。也许某种搜索或过滤功能比在树中一次性呈现所有内容更有用?

第三个选择是寻找第三方控件,或者制作您自己的包含虚拟化的自定义控件。但自己制作可能会很困难且耗时。


0
投票
为了获得最佳性能,“虚拟化”至关重要,确保仅在显示时才创建节点。这应该可以将昂贵的 UI 对象的数量从 380k 显着减少到几百个。不幸的是,WinForms TreeView 文档中没有提到虚拟化,这表明它可能不受支持。

© www.soinside.com 2019 - 2024. All rights reserved.