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 に答える