【发布时间】:2012-09-17 11:54:48
【问题描述】:
我使用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() 会被调用?
【问题讨论】:
-
您正在尝试优化一个错误。将窗口拖出屏幕并重新打开,以查看 DrawNode 事件无法正确绘制。
-
@Hans Passant,有什么办法可以正确地做到这一点,我的意思是只绘制我的部分控件?
-
我不应该使用
.Invalidate方法。我尝试使用.Refresh方法,它重绘了信息部分,但是其他部分(drawNode())变成了白色,这部分的一切都消失了,请帮助我 -
在您修复有缺陷的 DrawNode 方法之前,这不会变得更好。您将需要删除该代码中的 myComboBoxChanged。
-
@Hans Passant,你能告诉我我需要如何实现那种代码(当我只需要重绘部分控件时)
标签: c# .net winforms drawing controls