web-dev-qa-db-fra.com

Supprimer les éléments sélectionnés de la liste

Je souhaite le faire, mais la liste de sélection change à chaque suppression. Elle génère donc une exception d'exécution même si j'essayais de créer un nouvel objet.

J'ai essayé comme ça:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
   selectedItems = lstClientes.SelectedItems;
if (lstClientes.SelectedIndex != -1)
{ 
    foreach (string s in selectedItems)
        lstClientes.Items.Remove(s);
}
else
    MessageBox.Show("Debe seleccionar un email");
17
Cristo

Vous ne pouvez pas modifier une collection en itérant (à l'aide de foreach). Utilisez plutôt une boucle for inverse:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
selectedItems = lstClientes.SelectedItems;

if (lstClientes.SelectedIndex != -1)
{ 
    for (int i = selectedItems.Count - 1; i >= 0; i--)
        lstClientes.Items.Remove(selectedItems[i]);
}
else
    MessageBox.Show("Debe seleccionar un email");

L'utilisation d'une boucle inversée garantit que vous n'en sautez aucune après les avoir supprimées.

29
Patrick Quirk
selectedItems = lstClientes.SelectedItems;

Cette ligne ne crée pas de nouvelle collection, mais définit une référence à celle de la liste. Vous parcourez donc une collection et essayez d’en retirer des éléments à la fois. Ce n'est pas possible

Vous pouvez utiliser ceci, par exemple:

foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
   lstClientes.Items.Remove(s);
8
horgh

Simple comme ça:

while (lst.SelectedItems.Count > 0)
{
   lst.Items.Remove(lst.SelectedItems[0]);
}
6
Ninh Pham
lst.Items.Remove(lst.Items[lst.SelectedIndex]);

Vous pouvez l'utiliser si vous ne voulez pas faire de boucle

Remarque: Ceci ne fonctionne que pour supprimer 1 élément (plusieurs sélections ne suppriment que le premier élément sélectionné)

2
Peetinun

J'ai trouvé une meilleure solution. 

        if (listBoxIn.SelectedItems.Count != 0)
        {
            while (listBoxIn.SelectedIndex!=-1)
            {
                listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);                  
            }
        }
1

J'ai rencontré le même problème aujourd'hui et je voulais quelque chose d'un peu plus propre et j'ai proposé cette solution Linq:

foreach (int index in myListBox.SelectedIndices.Cast<int>().Select(x => x).Reverse())
    myListBox.Items.RemoveAt(index);

Fondamentalement identique à la solution de Patrick consistant à effectuer une itération en arrière et à supprimer des éléments sélectionnés. Cependant, au lieu d’itérer une itération en arrière, nous inversons la liste des éléments à supprimer et une itération en avant. Nous ne parcourons plus l'énumération d'origine, nous sommes donc autorisés à supprimer des éléments de foreach.

1
Zachary Canann

Pour compléter la réponse de Patrick, j'ai tendance à utiliser une suppression d'index inversée, car elle conserve l'index d'éléments en attente de suppression pendant leur suppression sans supprimer les éléments identiques.

private void BtnDelete_Click(object sender, EventArgs e) {
    if (listBox.SelectedIndex == -1) {
        return;
    }

    // Remove each item in reverse order to maintain integrity
    var selectedIndices = new List<int>(listBox.SelectedIndices.Cast<int>());
    selectedIndices.Reverse();
    selectedIndices.ForEach(index => listBox.Items.RemoveAt(index));
}
0
Cody Rees

Créer une variable globale:

public partial class Form1 : Form
    {

        Int32 index;
    }

Puis, au changement d'index sélectionné, enregistrez cet index dans la variable que vous avez définie:

 private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
        {

           layerindex = lsbx_layers.SelectedIndices[0];//selected index that has fired the event
         }

Enfin, supprimez l'élément:

 lsbx_layers.Items.RemoveAt(Layerindex);
0
Yusufm.Salh

C'est le moyen le plus simple de supprimer les éléments sélectionnés.

 for(int v=0; v<listBox1.SelectedItems.Count; v++) {
            listBox1.Items.Remove(listBox1.SelectedItems[v]);
        }
0
Azaz Khan