2010-10-29 8 views
5

Ho provato a rimuovere elementi specifici da un listview utilizzando il metodo RemoveAt(). Ma quando lo rimuovo la prima volta alcuni oggetti rimarranno.Gli elementi specificati non verranno eliminati quando si utilizza ListView.Item.RemoveAt()

Ad esempio: vedere l'immagine qui sotto

alt text

Codice:

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); 
     } 
    } 

risposta

5

Vedere MSDN nella sezione Note.

Quando si rimuove un elemento dalla collezione , gli indici cambiamento per successivi articoli della collezione. Tutte le informazioni sull'elemento rimosso vengono cancellate. È possibile utilizzare questo metodo per rimuovere un elemento specifico dalla raccolta specificando l'indice di l'elemento da rimuovere dalla raccolta . Per specificare l'articolo su rimuovere invece dell'indice sull'elemento , utilizzare il metodo Rimuovi. Per rimuovere tutti gli elementi dalla raccolta, utilizzare il metodo Clear .

Modifica: Vedere la risposta di Moot. Il link/riferimento sopra si applica anche alla sua risposta.

Edit 2:

appena tornato al bancone fino uno se si trova una corrispondenza.

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 Perché è probabilmente quello che vorrei fare. –

+1

+1, @TSS, se cambi il ciclo 'for' per iniziare alla fine e vai a' 0', puoi sbarazzarti di 'i -;'. –

+0

Bel fermo alla deriva. – Inisheer

4

Quando si elimina la prima A1, la lista si restringe, e l'elemento a 1 e 2 diventano il tuo elemento a 0 e 1. Quindi, quando il tuo loop aumenta, cancella l'A1 a 1 (il terzo) e salta quello che è sceso a 0.

2

procedere come segue:

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); 
} 

Buona fortuna!