我有一个像这样的TreeView:
System.Windows.Forms.TreeView treeView;
this.treeView = new System.Windows.Forms.TreeView();
treeView.Update();
treeNode = this.treeView.Nodes.Add(yadda1);
treeNode = this.treeView.Nodes.Add(yadda2);
treeNode = this.treeView.Nodes.Add(yadda3);
foreach (TreeNode node in treeView.Nodes)
{
namedNode = getTreeNodeFromName(documentType, node);
if (namedNode != null)
{
break; // found it
}
}
treeView.SelectedNode = namedNode;
treeView.SelectedNode.BackColor = Color.Blue;
treeView.Focus();
this.treeView.EndUpdate();
此代码几乎可以使用。默认情况下,所选节点由背景颜色指示为非常浅灰色,难以看清。所以我以编程方式将其设置为蓝色,但在用户点击另一个节点之前,背景不会变为蓝色。
上一个问题建议调用treeView.Focus()
,但这没有任何区别。
如何让背景颜色立即转到蓝色?
答案 0 :(得分:1)
这是另一种方法。直接从TreeView类继承。这只是获取绘制节点文本部分的基础知识。我还在制作'线路。部分但是必须等到我回家。但是,这将使您开始并显示另一种方法来做您想要的。从控件派生来创建自己的类是非常强大的,并且允许最大的灵活性,但也需要最大的努力。即便如此,它也不是纪念性的。
public class CustomTreeView : TreeView
{
public CustomTreeView() : base()
{
this.SetStyle(
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer |
ControlStyles.Opaque, true);
}
protected override void OnPaint(PaintEventArgs e)
{
using (System.Drawing.SolidBrush BackGroundBrush = new System.Drawing.SolidBrush(System.Drawing.SystemColors.Window))
using (System.Drawing.SolidBrush ForeGroundBrush = new System.Drawing.SolidBrush(System.Drawing.SystemColors.WindowText))
using (System.Drawing.SolidBrush BackGroundBrushHighLight = new System.Drawing.SolidBrush(System.Drawing.Color.DarkGreen))
using (System.Drawing.SolidBrush ForeGroundBrushHighLight = new System.Drawing.SolidBrush(System.Drawing.Color.Pink))
{
e.Graphics.FillRectangle(BackGroundBrush, e.ClipRectangle);
System.Drawing.SolidBrush CurrentNode;
int count = this.Nodes.Count;
for (int index = 0; index < count; ++index)
{
if (Nodes[index].IsSelected)
{
CurrentNode = ForeGroundBrushHighLight;
e.Graphics.FillRectangle(BackGroundBrushHighLight, Nodes[index].Bounds);
}
else
{
CurrentNode = ForeGroundBrush;
}
e.Graphics.DrawString(Nodes[index].Text, this.Font, CurrentNode, Rectangle.Inflate(Nodes[index].Bounds, 2, 0));
}
}
}
}