2009-02-13 9 views
4

J'ai une liste avec deux colonnes et j'utilise un menu contextuel pour permettre aux utilisateurs de supprimer les lignes sélectionnées. Pour supprimer les lignes sélectionnées, je l'ai essayé avec le code suivant, mais il ne fonctionne pas:Supprimer les lignes sélectionnées de la liste multi-colonnesVoir

private void toolStripMenuItem1_Click(object sender, EventArgs e) 
{ 
    listView1.SelectedItems.Clear(); 
} 

Je soupçonne que c'est parce que le listview a deux colonnes, mais je ne peux pas trouver une solution pour éliminer lignes sélectionnées La suppression de toutes les lignes fonctionne avec: listView1.Items.Clear();.

+1

Pouvez-vous modifier le premier message au lieu de répondre 2 fois. Si quelqu'un est upvoted, vous ne voyez plus vos messages. ou vice versa – RvdK

Répondre

5

Le dernier exemple BeefTurkey semble correct, mais il devrait décrémenter la variable i après avoir supprimé un élément sélectionné:

for (int i = 0; i < listView1.Items.Count; i++) 
{ 
    if (listView1.Items[i].Selected) 
    { 
     listView1.Items[i].Remove(); 
     i--; 
    } 
} 

L'index des éléments plus grands que i est décrémenté de 1 après le retrait. Vous devez donc repositionner i pour correspondre au prochain élément non testé.

+1

n'a pas pensé à ça - merci. – BeefTurkey

+0

Cette solution fonctionne tout simplement comme un charme, n'a pas encore brisé sur moi! +1 – Kaitlyn

0

Cela semble fonctionner:

for (int i = 0; i < listView1.Items.Count; i++) 
    { 

     if (listView1.Items[i].Selected) 
     { 
      listView1.Items[i].SubItems.Clear(); 
     } 

    } 

Est-il possible de supprimer des éléments et réordonner ListView afin qu'il n'y ait pas de lignes vides au milieu des autres lignes?

0

Cela semble être une meilleure solution:

for (int i = 0; i < listView1.Items.Count; i++) 
{ 
    if (listView1.Items[i].Selected) 
    { 
     listView1.Items[i].Remove(); 
    } 
} 
0

Qu'est-ce que vous pouvez faire:

foreach (ListViewItem Item in LstvClients.Items) 
{  
    if (item.Selected) 
    { 
     LstvClients.Items.Remove(Item); 
    } 
} 

(le vôtre est mieux, item.Remove())

+0

En fait, cela ne bougera pas. Vous ne pouvez pas jouer avec une collection pendant que vous l'itérez. – BFree

+0

Mais cela semble fonctionner. – BeefTurkey

+0

BFree: Oui ça a l'air bizarre mais ça fonctionne – RvdK

2
while (listBox1.SelectedItems.Count > 0) 
{ 
    listBox1.Items.Remove(listBox1.SelectedItem); 
} 
0

J'utilise quelque chose de légèrement différent, alors les autres pour supprimer tous les éléments sélectionnés à partir d'un contrôle ListView:

foreach (ListViewItem listViewItem in listView1.SelectedItems) 
{ 
    listView1.Items.Remove(listViewItem); 
} 

Je ne sais pas comment cela correspondre en terme de performance au d'autres méthodes affichées sur de grandes listes, mais je pense que c'est un peu plus propre dans les cas où ce n'est pas un problème.

0

C'est la manière correcte de supprimer tous les éléments sélectionnés. La méthode consiste à toujours accéder au premier élément sélectionné avec un index 0 et à faire une boucle jusqu'à ce qu'il ne reste plus d'éléments sélectionnés. Vous ne pouvez pas faire référence aux autres éléments de la collection avec un index absolu en toute sécurité, car les index changeront dès que vous supprimerez l'un des éléments.

while(listView1.SelectedItems.Count > 0) 
{ 
    listView1.Items.Remove(lvFiles.SelectedItems[0]); 
} 
1
foreach(ListViewItem lvItem in lvDocument.SelectedItems) 
{ 
     lvDocument.Items.Remove(lvItem); 
} 
0

do 
 
{ 
 
    this.listView1.CheckedItems[0].Remove(); 
 
} while (this.listView1.CheckedItems.Count > 0);

Cela fonctionne mieux

Questions connexes