2013-03-03 3 views
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(); 

     } 
+0

Я не вижу здесь рекурсии, если GetExtendedFeatures не на самом деле метод кода вы показываете. Для вашего текущего кода он проходит только через дочерние узлы проверенных родителей. ayou нужно перебрать все узлы и посмотреть, выбраны они или нет, а затем добавить в список. – echavez

ответ

3

Чтобы получить список всех выбранных узлов в 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]); 

С уважением,

+0

Я добавил ваш метод, затем добавил, что вызов метода ScanNodes к моей кнопке запуска, а затем добавил окно сообщения, чтобы показать выбранные узлы, но он остается пустым. Ни один из моих проверенных узлов не запускает ваш чек, и, к сожалению, я не понимаю, почему. –

+0

Код ScanNodes не возвращает значение, просто сохраняет свойство текста проверенных узлов в список, можете ли вы опубликовать свой код button_click? – echavez

+0

См. Ревизию. –

Смежные вопросы