Yo soy la selección de todos los controles que tengo en un form

si los controles son Treeviews, voy a recorrer todos los nodos tienen

Necesito algo como:
(Y es mi código)

foreach (Control c in PanelSM.Controls)
{
    if (c is TreeView) 
    {    
        TreeNodeCollection myNodes = c.Nodes;//<<<<< Here is a mistake
        foreach (TreeNode n in myNodes)
        {
            String text = rm.GetString(n.Name);
            //And more things
            //...
            //...
            //...
       }
    }
    //...
}

Alguna idea?

Gracias

  • Ahhhh.. Lo Siento. Mi mal.
  • espera… es todo lo que usted está necesitando ((TreeView)c).Nodes?
  • ¿ esta ayuda ?
  • Yo la vi @ Sriram Sakthivel. El problema es: yo no puedo hacerlo: TreeNodeCollection myNodes = c.Los nodos;//<<<<< Aquí se el error
  • Kopp OMFG! Fue muy fácil. muchas Gracias!
  • No hay problema

InformationsquelleAutor Jean | 2013-10-30

6 Comentarios

  1. 2

    Tu error está en que c es en realidad una variable de tipo Control, que no tiene un Nodos miembro. Usted necesitará para lanzarla como un TreeView tipo.

    Que usted puede hacer cualquiera de estos dos enfoques:

    if (c is TreeView) 
    {
        TreeNodeCollection myNodes = ((TreeView) c).Nodes; //<<--- Note the cast
        ...
    }

    o

    TreeView tv = c as TreeView;
    if (tv != null)
    {
            TreeNodeCollection myNodes = tv.Nodes;
            ...
    }
    • Muchas gracias! @elgonzo
  2. 22

    Que usted necesita para utilizar recursividad. Un método como este debería ser suficiente

    IEnumerable<TreeNode> Collect(TreeNodeCollection nodes)
    {
        foreach(TreeNode node in nodes)
        {
            yield return node;
    
            foreach (var child in Collect(node.Nodes))
                yield return child;
        }
    }

    A continuación, en el método que usted puede hacer

     foreach (var node in Collect(tree.Nodes))
     {
         //you will see every child node here
     }
    • Hey @Darren Kopp muchas Gracias! Por regla!
    • Esta es una solución muy elegante, gracias!
  3. 7

    Es muy fácil:

    void TraverseTree(TreeNodeCollection nodes)
    {
        foreach (var child in nodes)
        {
            DoSomethingWithNode(child);
            TraverseTree(child.Nodes);
        }
    }

    Y llamarlo con:

    TraverseTree(MyTreeView.Nodes);
    • Muchas gracias @Jim Mischel
  4. 1

    Prefiero la simplicidad, y aquí está mi solución simple:

        protected void TraverseNodes(TreeNodeCollection nodes, string action, int maxDepth = 2) 
        {
            foreach (TreeNode node in nodes)
            {
                if (node.ChildNodes.Count > 0 && node.Depth < maxDepth)
                    TraverseNodes(node.ChildNodes, action, maxDepth);
    
                //do something!!!
                var x = node.Text;
                node.Checked = !node.Checked;
            }
        }

    Decidí incluir una «profundidad máxima» como un bono, así que disfruta.

    Llamada de la siguiente manera:

                    TraverseNodes(this.Activities.Nodes, "");

    A diferencia de algunos de los ejemplos publicados aquí, pude probar este (ouch! Yo les oye decir).

  5. 0

    probar este

        foreach (TreeNode t in tvMenu.Nodes)
        {
            for (int iParent = 0; iParent < t.ChildNodes.Count; iParent++)
            {
                for (int iChild = 0; iChild < t.ChildNodes[iParent].ChildNodes.Count; iChild++)
                {
                    if (t.ChildNodes[iParent].ChildNodes[iChild].Text == "")
                    {
    
                    }
                }
            }
        }
  6. 0

    Edificio en la parte superior de Darren gran respuesta, usted puede combinar la recursividad y la extensión de la clase de.

    Declarar en algún lugar en el espacio de nombres :

    public static class MyExtensions
    {
        public static IEnumerable<TreeNode> All( this TreeNodeCollection nodes )
        {
            foreach( TreeNode n in nodes )
            {
                yield return n;
                foreach( TreeNode child in n.Nodes.All( ) )
                    yield return child;
            }
        }
    }

    Nota el «este» antes de que el primer argumento del método.

    A continuación, puede utilizar este nuevo método en todos los treeviews como:

    foreach( TreeNode n in myTreeview.Nodes.All() ) ...

Dejar respuesta

Please enter your comment!
Please enter your name here