3

ノードと子を持つノードを含むTreeViewリストを持つプログラムがあります。これらはすべて、checkboxプロパティが有効になっています。どのノード/ノードの子がチェックされているかをチェックする方法を知る必要があります。これまでのところ、親ノードを正常にテストできましたが、以下を使用している子はありません。

//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

4 に答える 4

5

選択したすべての項目をマークする再帰関数を定義できます。

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

        MarkSelectedNodes(n.Nodes);
    }
}

次のように呼び出します。

MarkSelectedNodes(treeView1.Nodes);
于 2013-01-25T22:09:26.977 に答える
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);
    }
}
于 2013-01-25T22:21:33.867 に答える
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;
        }
    }
于 2013-01-25T22:20:55.730 に答える
0

子ノードにもう 1 レベル ドロップダウンする必要がありました。同じコード、別のループ:

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;
            }
        }
于 2013-01-25T22:08:52.740 に答える