Почему мои дочерние узлы не обнаруживаются без выбора родительского узла?

В моей форме есть деревянный список с включенными флажками. Мне нужно добавить что-нибудь отмеченное в список, чтобы я мог написать этот список. Если я проверяю какие-либо родительские узлы (или узлы самого высокого уровня), он включает их. Если я выбираю какие-либо родительские узлы, он также выбирает свои дочерние узлы (это сделано намеренно) и отображает их. Но если я проверю только какие-либо дочерние узлы, он не добавит их в мой список.

//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 родительских узла, рекурсия, которая происходит (думаю, что это правильный термин) заставляет его найти первый проверенный узел, затем запускается заново и добавляет этот же проверенный узел второй раз, прежде чем он достигнет второго набор узлов.

Я предоставил свой тест узла, надеюсь, этого достаточно, чтобы определить, почему он не обнаруживает дочерние узлы, выбранные без выбранного родительского узла.

ОБНОВЛЕНО - 18.03.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();

        }

1 ответ

Решение

Чтобы получить список всех выбранных узлов в TreeView, вы можете использовать следующее:

Supose список назван 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]);

С Уважением,

Другие вопросы по тегам