2010-10-29 11 views
5

He intentado eliminar elementos específicos de una vista de lista utilizando el método RemoveAt(). Pero cuando lo elimino la primera vez, algunos elementos permanecerán.Los elementos especificados no se eliminarán al usar ListView.Item.RemoveAt()

Por ejemplo: ver la imagen de abajo

alt text

Código:

private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < listView1.Items.Count; i++) 
     { 
      if (listView1.Items[i].SubItems[0].Text == "A1") 
      { 
       listView1.Items.RemoveAt(i); 
      } 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     for(int i = 0; i<3; i++) 
     { 
      ListViewItem lvi = new ListViewItem("A1"); 
      lvi.SubItems.AddRange(new string[] {"desc" + i.ToString(), i.ToString()}); 
      listView1.Items.Add(lvi); 
     } 

     for (int i = 0; i < 2; i++) 
     { 
      ListViewItem lvi = new ListViewItem("A2"); 
      lvi.SubItems.AddRange(new string[] { "desc" + i.ToString(), i.ToString() }); 
      listView1.Items.Add(lvi); 
     } 
    } 

Respuesta

5

Consulte MSDN en el Observaciones sección.

Cuando se elimina un elemento de la colección , los índices de cambio para artículos subsiguientes de la colección. Se ha eliminado toda la información sobre el elemento eliminado . Puede utilizar este método para eliminar un elemento específico de la colección especificando el índice de el elemento para eliminar de la colección . Para especificar el elemento a eliminar en lugar del índice al elemento , utilice el método Eliminar. Para eliminar todos los elementos de la colección, use el método Clear.

Editar: Consulte la respuesta de Moot. El enlace/referencia anterior también se aplica a su respuesta.

Edición 2:

Acabo de volver el contador a uno si encuentra una coincidencia.

for (int i = 0; i < listView1.Items.Count; i++) 
    { 
     if (listView1.Items[i].SubItems[0].Text == "A1") 
     { 
      listView1.Items.RemoveAt(i); 
      i--; // Back counter up one 
     } 
    } 
+0

+1 Porque eso es probablemente lo que haría. –

+1

+1, @TSS, si cambia el bucle 'for' para comenzar al final y va a' 0', puede deshacerse de 'i -;'. –

+0

Buena captura a la deriva. – Inisheer

4

Cuando se elimina la primera A1, la lista se reduce, y el elemento en 1 y 2 se convierta su elemento en 0 y 1. Por lo tanto, cuando su ciclo se incrementa, elimina A1 en 1 (el tercero) y se salta el que se movió a 0.

2

Haz lo siguiente:

private void button1_Click(object sender, EventArgs e) 
{ 
    var itemsToRemove = new List<ListViewItem>(); 

    foreach (ListViewItem item in listView1.Items) 
    { 
     if (item.SubItems[0].Text == "A1") 
      itemsToRemove.Add(item); 
    } 

    foreach (var item in itemsToRemove) 
     listView1.Items.Remove(item); 
} 

Buena suerte!

Cuestiones relacionadas