2010-03-23 140 views
9

Tengo un problema al seleccionar un determinado nodo secundario.Cómo seleccionar cierto nodo secundario en TreeView, C#

lo que quiero lograr: que tienes esta vista de árbol, por ejemplo, (uno de los padres con los nodos de dos niños):
Padres
-Niño con un valor de 5
-Niño con un valor de 2.

Quiero añadir estos dos valores y asignarlos a nodo padre:

resultado de padres 7
-Niño 5
-Niño 2.

por supuesto, una vista de árbol más grande sería tener varios padres y muchos de los niños y todos ellos se suman a un nodo raíz.

¿Cómo puedo hacer esto? pls ayuda.

THX,
Caslav

+4

para entender la recursividad primero hay que entender la recursividad. – albertjan

+0

¿Alguna de las soluciones suministradas funciona para usted? ¿Necesitas ayuda adicional con esto? – SwDevMan81

+0

No, casi no me ayudan ... No sé si entiendes lo que necesito, entonces: necesito sumar todos los valores que los nodos secundarios contienen en un valor: el nodo raíz. Este árbol puede tener varios padres-hijos-padres-hijos y así sucesivamente ... Estaba pensando el otro día "¿Puede una recursión ayudar?" ?? – Caslav

Respuesta

0

No sé si esto coincide con su solicitud, pero esto añadirá todas niño> nodo padre

private void button2_Click(object sender, EventArgs e) 
    { 
     int grandTotal = CalculateNodes(this.treeView1.Nodes); 
    } 
    private int CalculateNodes(TreeNodeCollection nodes) 
    { 
     int grandTotal = 0; 
     foreach (TreeNode node in nodes) 
     { 
      if (node.Nodes.Count > 0) 
      { 
       int childTotal = CalculateNodes(node.Nodes); 
       node.Text = childTotal.ToString(); 
       grandTotal += childTotal; 
      } 
      else 
      { 
       grandTotal += Convert.ToInt32(node.Text); 
      } 
     } 
     return grandTotal; 
    } 

que debe hacer alguna comprobación de errores, etc, etc para que sea sólida

0

De esta manera:

public class TotalingTreeNode : TreeNode 
{ 
    private int _value = 0; 

    public int Value 
    { 
     get 
     { 
      if (this.Nodes.Count > 1) 
       return GetTotaledValue(); 
      else 
       return _value; 
     } 
     set 
     { 
      if (this.Nodes.Count < 1) 
       _value = value; 
     } 
    } 

    private int GetTotaledValue() 
    { 
     foreach (TotalingTreeNode t in this.Nodes.Cast<TotalingTreeNode>()) 
     { 
      _value += t.Value; 
     } 
     return _value; 
    } 
} 
+1

Amigo, esto solo resumirá un montón de ceros. –

+0

Hehe muy cierto: P – albertjan

1
private TreeNode SearchTree(TreeNodeCollection nodes, string searchtext) 
     { 
      TreeNode n_found_node = null; 
      bool b_node_found = false; 
      foreach (TreeNode node in nodes) 
      { 
       if (node.Tag.ToString() as string == searchtext) 
       { 
        b_node_found = true; 
        n_found_node = node; 
       } 
       if (!b_node_found) 
       { 
        n_found_node = SearchTree(node.Nodes, searchtext); 
       } 
      } 
      return n_found_node; 
     } 

Fuente: http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21895513.html

0

En WinForms un nodo hijo de un árbol conoce su Padre. Para que pueda comunicarse con el padre en cualquier momento con la propiedad TreeNode.Parent. Viceversa, cada Nodo sabe que son nodos secundarios. Puede llegar a ellos usando Node.Nodes. Esta colección tiene un indexador que le permite acceder a los nodos secundarios usando un int o una cadena.

Para encontrar un TreeNode con un uso llave especial el siguiente código:

treeView.Nodes.Find("nodeKey", true); 

Puede finde una descripción de este método en MSDN

+0

Sí, soy consciente de eso. Voy a usar eso después de llegar al niño específico, pero ¿cómo acceder a él? – Caslav

+0

Tengo más de 10 hijos y no son del mismo nodo primario. y los nodos padre (cuando los valores se suman) actúan como hijos otra vez ... y así sucesivamente ... Esto tiene que ser automatizado (un clic en soulution) :) – Caslav

0

Se puede heredar de TreeNode con algo como esto:

public class TreeNodeEx : TreeNode { 
    // only displayed when having no children 
    public int Value { get; set; } 

    public bool HasChildren { 
     get { return Nodes.Count > 0; } 
    } 

    public int GetSumOfChildren() { 
     if (!HasChildren) 
      return Value; 

     var children = Nodes.Cast<TreeNode>().OfType<TreeNodeEx>(); 

     int sum = 0; 
     foreach (var child in children) 
      sum += child.GetSumOfChildren(); 

     return sum; 
    } 
} 
2

Podría hacer algo como lo siguiente. Asume que el valor que desea es parte del texto (el último valor después del último espacio).

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

namespace TreeViewRecurse 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 
     RecurseTreeViewAndSumValues(treeView1.Nodes); 
     } 

     public void RecurseTreeViewAndSumValues(TreeNodeCollection treeNodeCol) 
     { 
     int tree_node_sum = 0; 
     foreach (TreeNode tree_node in treeNodeCol) 
     { 
      if (tree_node.Nodes.Count > 0) 
      { 
       RecurseTreeViewAndSumValues(tree_node.Nodes); 
      } 
      string[] node_split = tree_node.Text.Split(' '); 
      string num = node_split[node_split.Length - 1]; 
      int parse_res = 0; 
      bool able_to_parse = int.TryParse(num, out parse_res); 
      if (able_to_parse) 
      { 
       tree_node_sum += parse_res; 
      } 
     } 
     if (treeNodeCol[0].Parent != null) 
     { 
      string[] node_split_parent = treeNodeCol[0].Parent.Text.Split(' '); 
      node_split_parent[node_split_parent.Length - 1] = tree_node_sum.ToString(); 
      treeNodeCol[0].Parent.Text = string.Join(" ", node_split_parent); 
     } 
     } 
    } 
} 
1

que utiliza una versión modificada versión de la respuesta de Redburn para encontrar un TreeNode por su nombre:

private TreeNode GetNodeByName(TreeNodeCollection nodes, string searchtext) 
    { 
     TreeNode n_found_node = null; 
     bool b_node_found = false; 
     foreach (TreeNode node in nodes) 
     { 
      //show(node.Name + ":" +searchtext); 
      if (node.Name == searchtext) 
      { 
       //show("score!"); 
       b_node_found = true; 
       n_found_node = node; 
       return n_found_node; 
      } 
      if (!b_node_found) 
      { 
       //show("here"); 
       n_found_node = f_get_node_by_name(node.Nodes, searchtext); 
       if (n_found_node!=null) 
       { 
        return n_found_node; 
       } 
      } 
     } 
     return null; 
    } 
Cuestiones relacionadas