Probleme boucle sur items listbox

Résolu
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013 - 4 janv. 2012 à 18:20
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013 - 4 janv. 2012 à 21:40
Bonjour,
Je voudrai supprimer des éléments d'une listbox qui contiennent un certain mot.

Celui-ci marche mais il ne supprime qu'un seul de ces éléments.

Pour information, ce code permet d'ignore tous les items contenant le mot "(Execute)"

Voici mon code :

            Dim x As Integer
            For x = 0 To ListBoxGames.Items.Count - 1
                If InStr(ListBoxGames.Items(x), "(Execute)") > 0 Then
                    ListBoxGames.Items.RemoveAt(x)
                    Exit For
                End If
            Next


Une idée ? Merci

6 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2012 à 18:26
Bonjour,

Quant on modifie le nombre d'items (que ce soit par suppression ou par rajout), il faut toujours y aller du dernier vers le premier (de bas en haut, donc), sinon : croche-pieds assurés.

D'autre part, ton exit for à la première occurrence, fait que, de toutes manières, tu ne risques pas de passer/supprimer au delà de cette 1ère occurrence !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2012 à 20:11
et en plus (rappel) :
cet
Exit For

interrompt l'exécution de la boucle à la première occurrence. Comment s'étonner ensuite de ce que les autres occurrences ne sont pas recherchées ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2012 à 21:33
et si tu essayais :
For x = ListBoxGames.Items.Count - 1 To 0 step -1


??


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2012 à 20:06
Oui, comme le dis ucfoutu, si tu supprimes le 2ème item, le 3ème devient second, logique, mais le prochain item item de la boucle sera le 3ème, qui est en réalité l'ancien 4ème : tu n'auras pas testé cet item.
De plus, les bornes de début et de fin d'un For-Next ne sont estimés qu'une fois au premier passage, tu risques :
- de sauter des items, puisque le 3ème devenu 2ème ne sera pas testé
- d'arriver en fin de boucle en voulant pointer sur un item qui n'existe plus.

-->
-1- Plutôt utiliser un Do-Loop qu'un For-Next
-2- Commencer par la fin pour éviter les sauts d'items

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
4 janv. 2012 à 21:25
Oui je viens de me rendre compte que ce Exit For était un peu mal placé. J'ai fait ceci pour l'instant, mais le problème viens du fait que j'ai un peu de mal a manipulé le To... c'est un peu bête je sais.

        If CheckBoxIgnoreSteamGames.CheckState = CheckState.Checked Then
            Dim x As Integer
            For x = ListBoxGames.Items.Count - 1 To 0
                MsgBox(x)
                If InStr(ListBoxGames.Items(x), "(Steam)") > 0 Then
                    ListBoxGames.Items.RemoveAt(x)
                End If
                If x = 0 Then
                End If
            Next
        End If
0
Sentynel Messages postés 85 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 13 juillet 2013
4 janv. 2012 à 21:40
Ah oui ca marche tout de suite mieux. Merci beaucoup pour votre aide.
0
Rejoignez-nous