Supprimer élément cheklistbox

Résolu
Souliabdo Messages postés 186 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 11 avril 2011 - 16 juil. 2009 à 10:10
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 16 juil. 2009 à 12:44
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

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 juil. 2009 à 11:41
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 ! -
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
16 juil. 2009 à 11:57
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
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 juil. 2009 à 12:44
"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 ! -
3
Souliabdo Messages postés 186 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 11 avril 2011 2
16 juil. 2009 à 12:37
merci pour vos réponses
0
Rejoignez-nous