首先阅读EDIT 2
我正在尝试设置一些方法来直观地区分winform应用程序中的节点。例如,交替颜色。
有人可以让我沿着这条路走下去吗?此外,有没有其他人必须这样做,你是怎么做到的?
由于
我也看过背景色设置(谢谢你),但我无法让它工作。我没有看到树视图的Paint()事件。我尝试将下面的代码放在我的Form Load()中,但它不起作用。可能是因为树视图已加载了吗?
private void frmCaseNotes_Load(object sender, System.EventArgs e)
{
foreach (TreeNode treeNode in treeView1.Nodes[0].Nodes)
{
treeNode.BackColor = Color.DeepSkyBlue;
}
}
好的,我在Form_Load()
上使用下面的方法解决了初始问题 foreach (TreeNode treeNode in treeView1.Nodes)
{
if (treeNode.Index % 2 == 0)
{
treeNode.ForeColor = Color.DodgerBlue;
}
else
{
treeNode.ForeColor = Color.Goldenrod;
}
现在我需要弄清楚,在某人的帮助下,如何循环所有层节点并应用我的交替着色。如果我沿着以下几行做某事,我可以实现。
foreach (TreeNode treeNode in treeView1.Nodes[1].Nodes[0].Nodes)
{
if (treeNode.Index % 2 == 0)
{
treeNode.ForeColor = Color.DodgerBlue;
}
else
{
treeNode.ForeColor = Color.Goldenrod;
}
如何以编程方式迭代所有图层?
答案 0 :(得分:3)
递归?
编辑:添加了用于消除颜色重复的代码
protected void ColorNodes(TreeNode root, Color firstColor, Color secondColor)
{
Color nextColor;
foreach (TreeNode childNode in root.Nodes)
{
nextColor = childNode.ForeColor = childNode.Index % 2 == 0 ? firstColor : secondColor;
if (childNode.Nodes.Count > 0)
{
// alternate colors for the next node
if (nextColor == firstColor)
ColorNodes(childNode, secondColor, firstColor);
else
ColorNodes(childNode, firstColor, secondColor);
}
}
}
private void frmCaseNotes_Load(object sender, System.EventArgs e)
{
foreach (TreeNode rootNode in treeView1.Nodes)
{
ColorNodes(rootNode, Color.Goldenrod, Color.DodgerBlue);
}
}
答案 1 :(得分:2)
执行此操作的最佳方法是覆盖OnPaint事件,并提供自己的代码以便在控件中进行绘制。
您可以找到许多关于在线覆盖onPaint方法的示例。
编辑:我实际上已经对此进行了一些调查,您可以单独设置树视图节点的BackColor。
Me.TreeView1.Nodes(0).BackColor = Color.AliceBlue
答案 2 :(得分:2)
//depth search on TreeView
TreeNode node = trv.Nodes[0];
Stack<TreeNode> list = new Stack<TreeNode>();
list.Push(node);
while (list.Count > 0)
{
while (node.Nodes.Count > 0)
{
list.Push(node.Nodes[0]);
node = node.Nodes[0];
}
//Will always have a leaf here as the current node. The leaf is not pushed.
//If it has a sibling, I will try to go deeper on it.
if (node.NextNode != null)
{
node = node.NextNode;
continue;
}
//If it does NOT have a sibling, I will pop as many parents I need until someone
//has a sibling, and go on from there.
while (list.Count > 0 && node.NextNode == null)
{
node = list.Pop();
}
if (node.NextNode != null) node = node.NextNode;
}
//broadth search on TreeView
Queue<TreeNode> list = new Queue<TreeNode>();
foreach(TreeNode node in trv.Nodes)
{
list.Enqueue(node);
}
foreach(TreeNode node in list)
{
foreach(TreeNode childNode in node.Nodes)
{
list.Enqueue(childNode);
}
}
答案 3 :(得分:0)
好的,这是我走了多远。不幸的是,它非常难看,我仍在手动编码 DEEP 我是如何进入它的。此外,它不会阻止相似的颜色彼此相邻。建议?
foreach (TreeNode treeNode in treeView1.Nodes)
{
treeNode.ForeColor = treeNode.Index % 2 == 0 ? Color.DodgerBlue : Color.Goldenrod;
foreach (TreeNode childNode in treeNode.Nodes)
{
childNode.ForeColor = childNode.Index % 2 == 0 ? Color.Goldenrod : Color.DodgerBlue;
foreach (TreeNode childChildNode in childNode.Nodes)
{
childChildNode.ForeColor = childChildNode.Index % 2 == 0 ? Color.DodgerBlue : Color.Goldenrod;
foreach (TreeNode childChildChildNode in childChildNode.Nodes)
{
childChildChildNode.ForeColor = childChildChildNode.Index % 2 == 0 ? Color.Goldenrod : Color.DodgerBlue;
}
}
}
}
答案 4 :(得分:0)
使用TreeView根目录中的子控件在Control类型上递归执行,并检查Control类型是否是您要查找的节点的类型,强制转换,更改背景颜色并完成。