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 つの親ノードを選択すると、発生する再帰 (正しい用語だと思います) により、最初にチェックされたノードが検出され、最初からやり直され、同じチェックされたノードが 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();

        }
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 に答える