1

我为我的控件使用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()被调用?

4

1 回答 1

0

更好的方法是创建自己的 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)
    {
        //...........
    }
}
于 2012-09-20T20:08:44.737 回答