2011-09-13 23 views
6

Tengo control treeview con un nivel de nodos padre e hijo, cada nodo tiene una casilla de verificación para seleccionar nodos después de la selección si hago clic en el botón eliminar Quiero eliminar hijo o padre lo que esté seleccionado, estoy usando siguiente código y se devuelve un error de códigoEliminar el nodo principal y los nodos hijo seleccionados: se modificó la recopilación; operación de enumeración no puede ejecutarse

se modificó

protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
    { 

     foreach (TreeNode Item in tvwSelectedOrganisations.CheckedNodes) 
     { 

      if (Item.Parent == null) 
      { 
       foreach (TreeNode ChildNode in Item.ChildNodes) 
       { 
        Item.ChildNodes.Remove(ChildNode); 
       } 

       tvwSelectedOrganisations.Nodes.Remove(Item); 
      } 
      else 
      { 
       Item.Parent.ChildNodes.Remove(Item); 
      } 

     } 

    } 

error

Colección; la operación de enumeración no se puede ejecutar.

código Modificado

 protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
     { 
      TreeNodeCollection SelectedNodes = tvwSelectedOrganisations.CheckedNodes; 

      foreach (TreeNode Item in SelectedNodes) 
      { 

       if (Item.Parent == null) 
       { 
        tvwSelectedOrganisations.Nodes.Remove(Item); 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(Item.Parent.ValuePath).ChildNodes.Remove(Item); 

       } 

       if (SelectedNodes.Count == 0) 
       { 
        break; 
       } 

      } 

     } 

Solución

int SelectedCount = SelectedNodes.Count; 

      for (int i = SelectedCount - 1; i >= 0; i--) 
      { 

       if (tvwSelectedOrganisations.CheckedNodes[i].Parent == null) 
       { 
        int j = tvwSelectedOrganisations.CheckedNodes[i].ChildNodes.Count; 
        tvwSelectedOrganisations.Nodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 
        i += j; 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ShowCheckBox = false; 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ChildNodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 

       } 

      } 
+0

Encontré la solución, el problema se debió a la lista genérica que se utiliza, He updtaed la publicación con el código correcto – sudheshna

Respuesta

4

Espero que esté utilizando .Net 3.5 o superior.

foreach (TreeNode ChildNode in Item.ChildNodes.ToList()) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

EDITAR

Si Item.ChildNodes no es Enumerable. Pruebe debajo entonces

for(int i = Item.ChildNodes.Count - 1; i >= 0; i--) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

O

while (Item.ChildNodes.Count > 0) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 
+0

im usando framework 4, pero cuando cambié el bucle foreach, se muestra un error de compilación, "Error 'System.Web.UI.WebControls.TreeNodeCollection' no contiene una definición para 'ToList' y no se puede encontrar ningún método de extensión 'ToList' que acepte un primer argumento de tipo 'System.Web.UI.WebControls.TreeNodeCollection' (¿Echas de menos una directiva de uso o una referencia de ensamblado?) " – sudheshna

+0

Acabo de agregar más opciones. – CharithJ

+0

Hola Charith, probé el ciclo for y funcionó, actualicé la publicación con la solución correcta.Gracias – sudheshna

2

No se puede tener esta línea dentro del foreach, debido a que se está modificando la colección que está enumerando en:

tvwSelectedOrganisations.Nodes.Remove(Item); 

En su lugar, cree una nueva lista de elementos para eliminar, luego repita la lista y elimine los elementos que están fuera (y después) de su foreach existente.

+0

SpikeX y Kalyan, he intentado esto No sé por qué también está eliminando el mismo elemento de mi nueva colección, I he modificado mi publicación para incluir mi nuevo código. Además, si intento eliminar un solo nodo o elementos en un solo nodo, funciona, pero si selecciono ítems en múltiples nodos, arrojo la misma excepción – sudheshna

1

En definitiva, se lanzará una excepción. Se supone que no debe delete o remove un elemento de una colección mediante un bucle en la misma colección. En su lugar, copie la colección Item.ChildNodes en una nueva colección vacía, intente realizar un bucle en la colección original y elimine los elementos que desee en la nueva colección, luego de realizar un bucle fuera del alcance del bucle, vuelva a asignar la colección modificada al original.

Cuestiones relacionadas