如果没有选择父节点,为什么没有检测到我的子节点?

时间:2013-03-03 17:07:10

标签: c# winforms recursion treeview treenode

我的表单中有一个已启用复选框的treelist。我需要将任何选中的内容添加到列表中,以便我可以将该列表写出来。如果我检查任何父节点(或最高级别节点),它包括它们。如果我选择任何父节点,它也会选择其子节点(这是有意的),并显示它们。但如果我只检查任何子节点,它将不会将它们添加到我的列表中。

//check to see if there are any nodes checked
            bool nodeHasCheck = false;
            foreach (TreeNode n in nodes)
            {
                if (n.Checked)
                {
                    nodeHasCheck = true;
                    break;
                }

                GetExtendedFeatures(n.Nodes);
            }

            //only return stuff if something's checked
            if (nodeHasCheck == true)
            {

                foreach (TreeNode n in nodes)
                {
                    if (n.Checked)
                    {
                        //n.BackColor = Color.Black;
                        nodeList.Add(n.Text);
                    }

                    GetExtendedFeatures(n.Nodes);
                }

如果我选择2个父节点,那么出现的递归(认为是正确的术语)会导致它找到第一个被检查的节点,然后重新开始,并在它之前第二次添加相同的已检查节点点击第二组节点。

我提供了我的节点测试,希望它足以确定在没有选择父节点的情况下它没有检测到选择的子节点的原因。

更新 - 2013年3月18日 我的按钮点击代码:

private void btnGenerate_Click(object sender, EventArgs e)
        {
            ScanNodes(treeView1.Nodes[0]);                
        }
private void ScanNodes(TreeNode parent)
        {
            foreach (TreeNode node in parent.Nodes)
            {
                if (node.Checked)
                {
                    nodeList.Add(node.Text.ToString());
                }
                if (node.Nodes.Count > 0)
                {
                    ScanNodes(node);
                }
            }


                var message = string.Join(Environment.NewLine, nodeList);
                message = message.Replace(Environment.NewLine, ", ");



                MessageBox.Show(message);
                nodeList.Clear();

        }

1 个答案:

答案 0 :(得分:3)

要获取TreeView中所有选定节点的列表,您可以使用以下命令:

将列表命名为nodeList

    //We First declare a recursive method to loop through all nodes, 
//we need to pass a root node to start 
    private void ScanNodes(TreeNode parent)
            {
                foreach (TreeNode node in parent.Nodes)
                {
                    if (node.Checked)
                    {
                        nodeList.Add(node.Text);
                    }
                    if (node.Nodes.Count > 0)
                    {
                        ScanNodes(node);
                    }
                }
            }

使用该设置您只需调用ScanNodes方法并传递TreeView的根节点:

ScanNodes(treeView1.Nodes[0]);

此致

相关问题