Supprimer élément cheklistbox [Résolu]

Signaler
Messages postés
186
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
11 avril 2011
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
bonjour;
j'ai un cheklistbox, je voudrais supprimer tous les élément sélectionnés :

IEnumerator ennum;
ennum = Mylist.CheckedIndices.GetEnumerator();
while (ennum.MoveNext() != false)
{
Mylist.Items.RemoveAt((int)ennum.Current);
}

lors de l'execution il m'affiche l'exception:
InvalidArgument=La valeur '3' n'est pas valide pour 'index'.

une idée s'il vous plaît

4 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

Ton problème vient très certainement du fait que la suppression d'un élément de la liste fausse ton compteur.

Voici une solution (pas la plus rapide, mais très simple en tout cas) qui devrait marcher :
while (clb.CheckedItems.Count > 0) clb.Items.Remove(clb.CheckedItems[0]);

Tant qu'il y a des éléments cochés, tu enlèves le premier de la liste.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
34
Pour supprimer des éléments d'une liste, il faut toujours commencer par le dernier

Sébastien FERRAND
Consultant Sénior
Microsoft Visual C# MVP
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
"Pour supprimer des éléments d'une liste, il faut toujours commencer par le dernier"

Tout à fait !
(sauf si on cherche à se casser la tête et à avoir un programme incompréhensible qui change l'index à chaque suppression,
ou si, comme dans mon exemple, on reprend tout depuis le début à chaque fois qu'on en a supprimé un (mais comme indiqué, c'est pas ce qu'il y a de plus rapide))

La raison est simple, prenons ce tableau :
Indice : 0 1 2 3 4 5 6 7 8
Valeur : A B C D E F G H I

Si l'on veut supprimer C, F et H (donc les indices 2, 5 et 7).

Imaginons qu'on commence par le premier : on supprime le 2ème (pas de problème et on obtient ça :
Indice : 0 1 2 3 4 5 6 7
Valeur : A B D E F G H I
Si ensuite on supprime le 5ème, au lieu de supprimer F, on supprime G => c'est pas ce qu'on voulait.
Indice : 0 1 2 3 4 5 6
Valeur : A B D E F H I
Ensuite, on tente de supprimer le 7ème... => IndexOutOfRangeException

Maintenant, si tu le fais à l'envers (en commençant par le 7, puis le 5 et enfin le 2, tu vois qu'il n'y a pas de problème, puisque seuls les indices supérieurs changent lors de l'insertion ou la suppression de données.

Mais à moins que tu aies des besoins de performances dans ton programme, j'aime bien ma méthode, qui tient sur une ligne et qui me semble très lisible.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
186
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
11 avril 2011
2
merci pour vos réponses