如何遍历Treeview节点的所有层?

时间:2009-04-08 16:50:07

标签: c# winforms .net-3.5 loops

首先阅读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;
        }
    }

编辑2

好的,我在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;
            }

如何以编程方式迭代所有图层?

5 个答案:

答案 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)

老兄,这个很严重。 Broadth Search很简单,但你是对的。深度搜索是一种痛苦。我希望它对你有所帮助。遗憾的是,由于这个网站上存在大量的问题,这种好玩的技巧可能会被遗忘。深度算法是粗略的,并假设没有兄弟姐妹的头节点。

//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类型是否是您要查找的节点的类型,强制转换,更改背景颜色并完成。