C# 如何重写Control.Invalidate()方法?

C# 如何重写Control.Invalidate()方法?,c#,.net,winforms,drawing,controls,C#,.net,Winforms,Drawing,Controls,我为我的控件使用OwnerDrawAll属性: this.customTreeView.DrawMode =System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll; this.customTreeView.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode); private void customTreeView_Dr

我为我的控件使用
OwnerDrawAll
属性:

this.customTreeView.DrawMode =System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.customTreeView.DrawNode += 
    new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode);

private void customTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e) {
   if(!myComboBoxChanged) {              // Draw the whole control(tree and info)
        drawNode(e);
        drawInfo(e);
   } else {                              // Draw only info
        drawInfo(e);
   }
}
然后我使用文本更改事件:

private void cBox_TextChanged(object sender, EventArgs e)
        {
            text = cBox.Text;                 // I need this in drawInfo()
            myComboBoxChanged = true;
            this.customTreeView.Invalidate();  // It doesn't do what I want
            myComboBoxChanged = false;
    }

在这里,
Invalidate()
方法重新绘制整个树,我如何修复此问题,以便只调用
drawInfo()

更好的方法是创建自己的TreeView类并封装所有方法和属性,以便:

public class MyTreeView : TreeView
{
    public bool TextBoxChanged { get; set; }
    public MyTreeView()
    {
        DrawMode = TreeViewDrawMode.OwnerDrawAll;
        DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(customTreeView_DrawNode);


    }
    protected override void OnInvalidated(InvalidateEventArgs e)
    {
        //comment  the below line to create your own Invalidate
        //base.OnInvalidated(e);
    }

    private void customTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        if (!TextBoxChanged)
        {              // Draw the whole control(tree and info)
            drawNode(e);
            drawInfo(e);
        }
        else
        {                              // Draw only info
            drawInfo(e);
        }
    }


    private void drawNode(DrawTreeNodeEventArgs e)
    {
        //...........
    }

    private void drawInfo(DrawTreeNodeEventArgs e)
    {
        //...........
    }
}

您正在尝试优化一个bug。将窗口从屏幕上拖下来,然后再拖回去,可以看到DrawNode事件无法正确绘制。@Hans Passant,有没有办法正确绘制,我的意思是只绘制我控件的一部分?我不应该使用
。Invalidate
方法。我尝试使用
.Refresh
方法,它重新绘制了信息部分,但其他部分(
drawNode()
)变为白色,并且该部分中的所有内容都消失了,请帮助meThis,直到您修复错误的drawNode方法,meThis才会变得更好。您需要去掉代码中的MyComboxChanged。@Hans Passant,您能告诉我如何实现这种代码(当我只需要重新绘制部分控件时)