2013-08-25 6 views
0

Я использую .net C# в VS 2012 и пытаюсь написать функцию, которая будет автоматически проверять все дочерние узлы проверенного родительского дерева. Я новичок в C# программирования, так что я нашел следующий код, но он имеет две проблемы:автообновить дочерние узлы при проверке родительского узла

  1. Линия если (HasChildNodes (узел)) Visual Studio отчеты HasChildNodes не известно.
  2. Я хочу начать с выбранного узла, который я нажимаю, и я думаю, что код пересекает все дерево?

Спасибо за любую помощь.

 treeView.BeginUpdate(); 
     //Loop through all the nodes of tree 
     foreach (TreeNode node in treeView.Nodes) 
     { 
      //If node has child nodes 
      if (HasChildNodes(node)) 
      { 
       if (node.Checked == true) 
       { 
        //Check all the child nodes. 
        foreach (TreeNode childNode in node.Nodes) 
        { 
         childNode.Checked = true; 
        } 
       } 
      } 
     } 
     treeView.EndUpdate(); 

ответ

0

Существует не HasChildNodes метод связан с TreeView, вы перепутали с XML материала здесь.

public void CheckNodes(TreeNode startNode){ 
    startNode.Checked = true; 
    foreach(TreeNode node in startNode.Nodes) 
     CheckNodes(node);  
}   
//then you can call the method above with the TreeNode you check 
CheckNodes(yourNode); 
+0

Еще раз спасибо за этот код, но, будучи довольно новым для C#, я не уверен, куда будет идти этот блок кода? Я не понимаю, находится ли этот блок кода в дополнение к блоку кода выше или это другое решение для моего первого вопроса? Спасибо. – user1292275

+0

@ user1292275 вы просто определяете метод 'CheckNodes' где-то в своем классе, тогда всякий раз, когда вы проверяете узел, например, в обработчике события' AfterCheck', вызывайте 'CheckNodes' с проверенным узлом, который прошел, тогда все дочерние узлы будут также можно проверить. –

+0

Я понял. Этот кодовый блок является другим решением моего вопроса. Спасибо, отлично работает! – user1292275

0

, чтобы проверить, если у вас есть ребенок узлы это достаточно, чтобы проверить

node.FirstNode != null 

как на ваш второй вопрос он выглядит как ваш код проверить дерево отверстия, а не только из данного узла, а затем снова я необходимо увидеть всю подпись метода и где вы удерживаете нажатый узел. если у вас в качестве члена, как myMember то изменить treeView в этом методе с myMember:

treeView.BeginUpdate(); 
    //Loop through all the nodes of tree 
    foreach (TreeNode node in myMember.Nodes) 
    { 
     //If node has child nodes 
     if (node.FirstNode != null) 
     { 
      if (node.Checked == true) 
      { 
       //Check all the child nodes. 
       foreach (TreeNode childNode in node.Nodes) 
       { 
        childNode.Checked = true; 
       } 
      } 
     } 
    } 
    treeView.EndUpdate(); 
0

Исправленная foreach цикл:

foreach (TreeNode node in treeView1.Nodes) 
     { 
      //If node has child nodes 
      if (node.Checked == true) //it is better to first check if it is "checked" then proceed to count child nodes 
      { 
       if (node.GetNodeCount(false) > 0) //check if node has any child nodes 
       { 
        //Check all the child nodes. 
        foreach (TreeNode childNode in node.Nodes) 
        { 
         childNode.Checked = true; 
        } 
       } 
      } 
     } 
+0

Спасибо за помощь. Этот код перемещается по всему дереву. Как бы это я начал, если бы я нажал на узел на полпути вниз и в дерево?(и хотел, чтобы все дочерние узлы этого узла были проверены). – user1292275

2

Ниже приведен рабочий код для просмотра дерева образца с проверкой и снимите флажок дочернего и родительского узла (Добавить древовидное представление и присвоить имя как tvwDynamic)

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

имя space Treeview { public partial class Form1: Form { public Form1() { ИнициализацияComponent(); }

private void Form1_Load(object sender, EventArgs e) 
    { 
     TreeNode MainNode = new TreeNode("Java"); 
     tvwDynamic.Nodes.Add(MainNode); 
     MainNode = new TreeNode("PHP"); 
     tvwDynamic.Nodes.Add(MainNode);   
     TreeNode node2 = new TreeNode("C#"); 
     TreeNode node3 = new TreeNode("VB.NET"); 
     TreeNode[] childNodes = new TreeNode[] {node2,node3}; 
     MainNode = new TreeNode("ASP.NET", childNodes); 
     tvwDynamic.Nodes.Add(MainNode); 
     TreeNode node4 = new TreeNode("Winforms"); 
     TreeNode node5 = new TreeNode("Webforms"); 
      TreeNode[] SubchildNodes = new TreeNode[] {node4,node5}; 
     MainNode = new TreeNode("Test",SubchildNodes); 
     tvwDynamic.Nodes[2].Nodes[1].Nodes.Add(MainNode); 
     tvwDynamic.CheckBoxes = true; 

    } 

    private void tvwDynamic_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
     if (e.Action != TreeViewAction.Unknown) 
     { 

      if (e.Node.Nodes.Count > 0) 
      { 

       /* Calls the CheckAllChildNodes method, passing in the current 

       Checked value of the TreeNode whose checked state changed. */ 

       this.CheckAllChildNodes(e.Node, e.Node.Checked); 

      } 

     } 

     SelectParents(e.Node, e.Node.Checked); 

    } 
    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 
    { 

     foreach (TreeNode node in treeNode.Nodes) 
     { 

      node.Checked = nodeChecked; 

      if (node.Nodes.Count > 0) 
      { 

       // If the current node has child nodes, call the CheckAllChildsNodes method recursively. 

       this.CheckAllChildNodes(node, nodeChecked); 

      } 

     } 

    } 


    private void SelectParents(TreeNode node, Boolean isChecked) 
    { 
     var parent = node.Parent; 

     if (parent == null) 
      return; 

     if (!isChecked && HasCheckedNode(parent)) 
      return; 

     parent.Checked = isChecked; 
     SelectParents(parent, isChecked); 
    } 

    private bool HasCheckedNode(TreeNode node) 
    { 
     return node.Nodes.Cast<TreeNode>().Any(n => n.Checked); 
    } 
} } 
1

Вот простой Control вы можете использовать в конструкторе Visual Studio,:

public class BetterTreeView : TreeView 
{ 
    /// <summary> 
    /// Whether to apply Checked property changes to child nodes. 
    /// </summary 
    public bool TickChildNodes { get; set; } 

    protected override void OnAfterCheck(TreeViewEventArgs e) 
    { 
     base.OnAfterCheck(e); 

     if (TickChildNodes) 
     { 
      foreach (TreeNode node in e.Node.Nodes) 
      { 
       node.Checked = e.Node.Checked; // Triggers OnAfterCheck (recursive) 
      } 
     } 
    } 
} 
0
treeview1.BeginUpdate(); 
foreach (TreeNode tn in e.Node.Nodes) 
    tn.Checked = e.Node.Checked; 
treeview1.EndUpdate(); 

Это работает для меня. вы должны добавить этот код в AfterCheck EventHandler.

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