2011-05-11 27 views
9

Tengo un TreeView con CheckBox en mi aplicación basada en formularios C# Windows. El usuario selecciona un elemento haciendo clic en las casillas de verificación en los nodos. Ahora quiero obtener el nombre de nodo de las casillas de verificación seleccionadas cada vez que haga clic en el botón getselectedlist presionado por el usuario. ¿Cómo lo hago?cómo obtener todas las casillas de verificación seleccionadas nombre de nodo en TreeView utilizando C# 4.0?

favor, me guía para salir de este problema ...

Respuesta

19

sólo puede utilizar sencilla función recursiva:

List<String> CheckedNames(System.Windows.Forms.TreeNodeCollection theNodes) 
{ 
    List<String> aResult = new List<String>(); 

    if (theNodes != null) 
    { 
     foreach (System.Windows.Forms.TreeNode aNode in theNodes) 
     { 
      if (aNode.Checked) 
      { 
       aResult.Add(aNode.Text); 
      } 

      aResult.AddRange(CheckedNames(aNode.Nodes)); 
     } 
    } 

    return aResult; 
} 

sólo lo utilizan en YourTreeView.Nodes

+2

Pero 'aResult.AddRange (CheckedNames (aNode.Nodes));' - es una iteración niños – Allender

+0

Lo siento, DIDT notan. –

+0

@ Allender: Está funcionando bien ... – Saravanan

1

En el evento de clic de botón, se puede recorrer todo el árbol, como se explica en http://msdn.microsoft.com/en-us/library/wwc698z7.aspx. Luego, para cada TreeNode, puede verificar si la casilla de verificación está marcada o no y, si está marcada, puede agregar su nombre a una lista.

11

O en lugar de forma recursiva bucle a través de todos los nodos del TreeView obtiene comprobado cada vez que algo que podría ser caro cuando, como yo, tiene cientos o miles de elementos en la lista, pero no se han verificado más de 20 elementos.

Agregue/elimine de una lista de cadenas después de marcar/desmarcar ya que solo necesitaba las cadenas FullPath, pero probablemente también podría usar una colección de TreeNode de la misma manera si lo necesitara.

public partial class Form1 : Form 
{ 
    List<String> CheckedNodes = new List<String>(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
     if (e.Node.Checked) 
     { 
      CheckedNodes.Add(e.Node.FullPath.ToString()); 
     } 
     else 
     { 
      CheckedNodes.Remove(e.Node.FullPath.ToString()); 
     } 
    } 
} 
1
//Uncomplicated, reliable method 
    List<int> _valueList = new List<int>(); 
    private List<int> getCheckedNodes(TreeNodeCollection _parentNodeList) 
    { 
     foreach (TreeNode item in _parentNodeList) 
     { 
      if (item.Checked) 
      { 
       _valueList.Add(Convert.ToInt32(item.Value)); 
      } 

      if (item.ChildNodes.Count > 0) 
      { 
       //.NET does not forget where it stayed. 
       getCheckedNodes(item.ChildNodes); 
      } 
     } 

     return _valueList; 
    } 
Cuestiones relacionadas