Probleme boucle sur items listbox

Résolu
Sentynel
Messages postés
86
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
13 juillet 2013
- 4 janv. 2012 à 18:20
Sentynel
Messages postés
86
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
235
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
235
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
235
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
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
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
86
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
86
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