1

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

//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 个父节点,则发生的递归(认为这是正确的术语)导致它找到第一个选中的节点,然后重新开始,并在第二个选中节点之前再次添加相同的选中节点节点集。

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

更新 - 3/18/13 我的按钮点击代码:

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

        }
4

1 回答 1

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]);

问候,

于 2013-03-03T20:37:01.423 回答