【问题标题】:.NET Treeview: How to prevent unchanged child nodes from being redrawn?.NET Treeview:如何防止未更改的子节点被重绘?
【发布时间】:2012-10-06 14:26:25
【问题描述】:

我正在使用 .NET 2010 中的 WinForms。我创建了一个继承自 Treeview 的用户控件,并且我正在对我的树节点的文本部分使用所有者绘图。

现在我必须解决一个奇怪的性能问题:

当树节点(我称之为“父节点”)的文本发生更改时,树视图控件会为“父节点”的每个子节点触发 DrawNode 事件,无论它们是否可见!!!

这给我的应用程序带来了很大的性能问题。如何防止 treeview 控件为每个子节点触发 DrawNode 事件?

非常感谢您的帮助!

【问题讨论】:

    标签: .net winforms performance events treeview


    【解决方案1】:

    我没有得到一个很好的重现,它只为可见节点生成 DrawNode 事件。但是,我确实看到它为父节点折叠的子节点生成 DrawNode 事件。您可以像这样过滤:

        private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
            if (e.Bounds.Height == 0) return;
            // etc..
        }
    

    【讨论】:

    • 谢谢,这样更好。但是重新绘制电视仍然需要将近一秒钟,而我的表单没有响应......对于重绘,我使用了调用委托方法的 Backgroundworker。在此方法 tv.beginupdate 中,执行 treenode.text 重命名和 tv.endupdate 语句。在执行这些操作时,如何让我的表单做出响应?
    • 呃,如果你对每个节点都这样做,那代价太高了。仅在 RunWorkerCompleted 事件处理程序中更新并使用 Begin/EndUpdate()。或者在 ReportProgress 调用中批量处理。
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多