如何测试TreeView节点和/或节点子项是否被检查?

时间:2013-01-25 22:02:17

标签: c# winforms loops treeview nodes

我有一个程序,其中包含一个包含节点的TreeView列表和包含子节点的节点。这些都具有checkbox属性enable。我需要知道如何检查哪些节点/节点子节点被检查。到目前为止,我已经能够成功测试父节点,但没有孩子使用:

//this  will turn black any node that is checked, doesn't affect the children though
    TreeNodeCollection nodes = this.treeView1.Nodes;
                foreach (TreeNode n in nodes)
                {
                    if (n.Checked)
                    {
                        n.BackColor = Color.Black;   
                    }
                }

如何检查父节点以及子节点?我已经搜索过,但没有找到任何可以解决这个问题的方法。

4 个答案:

答案 0 :(得分:4)

您可以定义一个标记所有选定项目的递归函数:

private static void MarkSelectedNodes(TreeNodeCollection nodes)
{
    foreach (TreeNode n in nodes)
    {
        if (n.Checked)
            n.BackColor = Color.Black;

        MarkSelectedNodes(n.Nodes);
    }
}

并称之为:

MarkSelectedNodes(treeView1.Nodes);

答案 1 :(得分:1)

您还可以“展开”递归以提高性能并避免堆栈溢出:

private static void MarkSelectedNodes(TreeNodeCollection nodes)
{
    Stack<TreeNode> toProcess =
        new Stack<TreeNode>(nodes.OfType<TreeNode>());

    while (toProcess.Count != 0)
    {
        TreeNode node = toProcess.Pop();
        if (node.Checked)
            node.BackColor = Color.Black;

        foreach (TreeNode child in node.Nodes)
            toProcess.Push(child);
    }
}

答案 2 :(得分:0)

您需要将另一个级别下拉到子节点中。相同的代码,只是另一个循环:

TreeNodeCollection nodes = this.treeView1.Nodes;
        foreach (TreeNode n in nodes)
        {
            foreach (TreeNode c in n.Nodes)
            {
                if (c.Checked)
                {
                    c.BackColor = Color.Gray;
                }
            }
            if (n.Checked)
            {
                n.BackColor = Color.Black;
            }
        }

答案 3 :(得分:0)

    public static IEnumerable<TreeNode>
                           GetAllCheckedChildNodes(TreeNode node)
    {
        foreach (TreeNode tmpNode in node.Nodes)
        {
            if (tmpNode.Checked)
            {
                yield return tmpNode;
            }

            foreach (var x in GetAllCheckedChildNodes(tmpNode))
            {
                yield return x;
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var checkedNodes = GetAllheckedChildNodes(MyRootNode);
        foreach (TreeNode checkedNode in checkedNodes)
        {
            checkedNode.BackColor = Color.Black;
        }
    }