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

Disable screen updating while collapsing or expanding all treenodes in a treeview

我创建了一个继承树视图 (CustomTreeview) 的 class,这将是我在整个问题中工作的 class。我想要一些方法来阻止 CustomTreeview 绘制自身和节点,直到所有折叠或展开完成。我将此称为屏幕更新,因为我在 VBA 中对此很熟悉。我已经尝试覆盖 OnPaint 方法以及 OnNodeDraw 方法。虽然,node.toggle 方法和 CollapseAll/ExpandAll 方法都不会触发任何 OnPaint/OnNodeDraw 方法。下面是我对 OnPaint/OnNodeDraw 方法的尝试(名称和输入显然略有不同以满足覆盖)。

protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
    if (!collapsing && !expanding)
    {
        base.OnDrawNode(e);
        NotifyNodeDrawn(this, e);
    }
}

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

public new void CollapseAll()
{
    collapsing = true;
    base.CollapseAll();
    collapsing = false;
    this.Invalidate();
}
public new void ExpandAll()
{
    expanding = true;
    base.ExpandAll();
    expanding = false;
    this.Invalidate();
}

如果这会按照我想要的方式工作,那么当我调用 ExpandAll() 时,节点将不会重绘,直到 CustomTreeview.Invalidate() 被调用。虽然,正如我在调用 ExpandAll/CollapseAll 之前所说的那样,根本不会进入 OnDrawNode/OnPaint 方法。

提前感谢您的帮助!

好吧,几天来我一直在努力解决这个问题,在发布问题后我终于找到了解决方案。 BeginUpdate() 会阻止控件重绘,直到您调用 EndUpdate()。简单有效的解决方案!我会把它留在这里,希望能帮助别人!如果有人对此谜有任何解决方案,这仍然不会进入 OnDrawNode/OnPaint 覆盖。

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