2012-09-17 71 views
1

我用我的控制OwnerDrawAll屬性:如何覆蓋Control.Invalidate()方法?

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()將被調用?

+0

你正在設法優化的錯誤。將窗口拖出屏幕,然後再次看到您的DrawNode事件無法正確繪製。 –

+0

@Hans Passant,有沒有什麼辦法可以正確地做,我的意思是隻畫出我的部分控件? –

+0

我不應該使用'.Invalidate'方法。我嘗試使用'.Refresh'方法重繪信息部分,但其他部分('drawNode()')變成白色,並且此部分中的所有內容都消失了,請幫助我 –

回答

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) 
    { 
     //........... 
    } 
}