【问题标题】:Why are my child nodes not detected without the parent node being selected?为什么在没有选择父节点的情况下检测不到我的子节点?
【发布时间】:2013-03-03 17:07:10
【问题描述】:

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

//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();

        }

【问题讨论】:

  • 我在这里看不到递归,除非 GetExtendedFeatures 实际上是您显示的方法代码。对于您当前的代码,它仅循环通过检查父母的子节点。 a您必须遍历所有节点并查看它们是否被选中,然后添加到列表中。

标签: c# winforms recursion treeview treenode


【解决方案1】:

要获取 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]);

问候,

【讨论】:

  • 我添加了您的方法,然后将 ScanNodes 方法的调用添加到我的运行按钮,然后添加了一个消息框以显示已选择的节点,但它仍然为空。我检查的节点都没有触发您的检查,不幸的是我不明白为什么。
  • ScanNodes的代码不返回值只是将选中节点的文本属性保存到列表中,您可以发布您的button_click代码吗?
  • 好的,我明白了,只需在调用 ScanNodes(treeView1.Nodes[0]); 之后将添加到 ScanNodes 方法的代码块放入 btnGenerate_Click 中即可;
  • 由于在每次执行 ScanNodes 后清除了 nodeList 的内容,它无法正常工作。记住 ScanNodes 是递归的,并且会在需要时调用自己。
  • 将该调用移出该方法并将其添加到按钮单击事件的末尾,并且确实可以正常工作。非常感谢echavez,享受最佳答案投票:)
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多