Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在折叠或展开树视图中的所有树节点时禁用屏幕更新_C#_Treeview - Fatal编程技术网

C# 在折叠或展开树视图中的所有树节点时禁用屏幕更新

C# 在折叠或展开树视图中的所有树节点时禁用屏幕更新,c#,treeview,C#,Treeview,我创建了一个继承treeview(CustomTreeview)的类,这将是我在整个问题中使用的类。我想要一些方法来阻止CustomTreeview绘制自身和节点,直到所有的折叠或扩展完成。我称之为屏幕更新,因为我熟悉VBA中的屏幕更新。我尝试过重写OnPaint方法和OnNodeDraw方法。但是,node.toggle方法和CollapseAll/ExpandAll方法都不会触发OnPaint/OnNodeDraw方法。下面是我为OnPaint/OnNodeDraw方法所做的尝试(名称和输入

我创建了一个继承treeview(CustomTreeview)的类,这将是我在整个问题中使用的类。我想要一些方法来阻止CustomTreeview绘制自身和节点,直到所有的折叠或扩展完成。我称之为屏幕更新,因为我熟悉VBA中的屏幕更新。我尝试过重写OnPaint方法和OnNodeDraw方法。但是,node.toggle方法和CollapseAll/ExpandAll方法都不会触发OnPaint/OnNodeDraw方法。下面是我为OnPaint/OnNodeDraw方法所做的尝试(名称和输入显然略有不同,以满足覆盖)

NotifyNodeDrawn触发一个我在另一个类中订阅的事件处理程序,以检查一些逻辑,确定它是处于展开模式还是折叠模式(我通过在CollapseAll/ExpandAll方法上写入设置的布尔值)

如果这将按照我希望的方式工作,那么当我调用ExpandAll()时,节点将不会重新绘制,直到调用CustomTreeview.Invalidate()为止。尽管如此,正如我在调用ExpandAll/CollapseAll之前所说的,它根本没有进入OnDrawNode/OnPaint方法


提前感谢您的帮助

好吧,我已经想了好几天了,在我发布问题后,我终于找到了解决方案。BeginUpdate()停止控件重画,直到调用EndUpdate()。简单有效的解决方案!我将把这个留在这里,希望能帮助别人!如果任何人对该谜题有任何解决方案,则仍不会进入OnDrawNode/OnPaint覆盖

public new void ExpandAll()
{
    BeginUpdate();
    expanding = true;
    base.ExpandAll();
    expanding = false;
    EndUpdate();
}

您需要
DoubleBuffered
自定义
TreeView
以减少闪烁。搜索双缓冲的treeview…实际上我有双缓冲,忘了提那个。它绘制速度很快,只需为每个展开的节点(约130个节点)重新绘制即可。这花费了很长时间。No mate您不应该在
OnDrawNode
事件中绘制所有节点,只需绘制
TreeView.ClientRectangle
属性中包含的内容即可。想一想,你需要画你看不见的东西吗?
public new void CollapseAll()
{
    collapsing = true;
    base.CollapseAll();
    collapsing = false;
    this.Invalidate();
}
public new void ExpandAll()
{
    expanding = true;
    base.ExpandAll();
    expanding = false;
    this.Invalidate();
}
public new void ExpandAll()
{
    BeginUpdate();
    expanding = true;
    base.ExpandAll();
    expanding = false;
    EndUpdate();
}