C#中的慢速树视图我有一个用C#编写的遗留应用程序,它显示一个非常复杂的树视图,包含10到20,000个元素。过去,我遇到过类似的问题(但在C++中),我使用Win32API提供的OWNERDATA函数解决了它。C#中有类似的机制吗?编辑:计划是优化创建时间和浏览时间。通过Win32API可用的方法在这两种情况下都非常出色,因为它可以将初始化时间减少到零,并且请求的元素数量仅限于那些在任何时候都可见的元素。Joshl:我们实际上正在按照您的建议进行操作,但我们仍然需要提高效率。我不相信.NETTreeView支持您想要的,尽管.NET的DataGridView支持这种类型的模型(请参阅DataGridView的VirtualMode属性)。TreeView将允许您绘制自己的节点,但不允许您从某个虚拟商店填充它们。如果可能,您可能需要考虑为您的应用程序使用DataGridView。如果没有,手动管理节点(如上面提到的joshl)可能会起作用,如果您可以在节点展开时通过正确刷新屏幕来解决一些问题。除此之外,您可能还想看看一些第3方供应商,例如这个(DivelementsSandGrid),它们可能(强调可能)支持您想要的操作模式。注意:截至2013年7月,Divelements不支持SandGrid。一种提高性能的技术是在用户展开树视图时加载TreeNode。通常,用户不需要同时在屏幕上打开20,000个节点。仅加载用户需要查看的级别,以及正确显示用户可用性所需的任何子信息(如果存在子项、计数、图标等,则展开图标)。当用户展开节点时,会及时加载子节点。来自Keith的有用提示:对于winformsTreeView,您需要至少有一个子节点,否则它不会显示展开[+],但您将处理TreeNodeExpanded事件以删除该虚拟节点并填充子节点。在我们的主要WinForm应用程序中,我们一次性加载树视图:到目前为止,性能良好。它实际上是我们没有用第三方替换的少数组件之一。根据我的经验,当您加载节点(一次性或按需)而不调用Begin/EndUpdate()时,TreeView性能会降低,特别是如果您的节点已排序,但如果您正确调用Begin/EndUpdate(),您应该'真正得到与组件本身相关的性能问题。注意:此答案因提问者的编辑而无效,声称他曾做过类似的事情,但我决定将其发布以供将来在此线程上的其他人参考。当我过去做过类似的事情时,我倾向于选择Naive懒加载风格。有一种方法可以通过创建所有子节点并将它们连接在一起,然后将节点添加到TreeView来使TreeView性能更好。如果那是我们正在谈论的图形性能。TreeView树=newTreeView();TreeNoderoot=newTreeNode("Root");填充根节点(根);//获取所有数据tree.Nodes.Add(root);否则,使用OnTreeNodeExpanded逐个节点加载它们。对于WindowsC#编程中的大数据,无论是WPF还是WinForms,我传统上都是动态添加节点。我加载了初始树根+孩子+孙子深。当任何节点展开时,我加载表示展开节点的孙子(如果有)的树节点。这种模式也适用于数据检索。如果您实际上是从具有数千或数百万条记录的源加载数据,您可能不想预加载该数据。没有用户愿意等待加载,也没有理由加载可能永远不会被查看的数据。我通常根据需要在后台线程上加载孙节点或孙节点数据,然后将该数据编组回UI线程并创建和添加节点。这使得UI响应。您可以直观地装饰树节点以指示它们仍在为用户从IO数据存储中加载。以上就是C#学习教程:C#慢树视图分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
