Supp des lignes d'une ListView qui ne contient pas un motprécis [Résolu]

Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
- - Dernière réponse : kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
- 8 sept. 2016 à 22:23
Bonjour,
j'ai besoin de votre aide pour le problème
aprés beaucoup de recherche et essais (combinaison de plusieurs formes) j'ai pu crée le code que je voulais mais il y a une erreur qui s'affiche
voici le code :
For i As Integer = 0 To ListView1.Items.Count - 1
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
End If
Next

l'erreur qui apparaît pour " If Not ListView1.Items(i).Text.Contains(TextBox1.Text) Then " est :
InvalidArgument=La valeur '12' n'est pas valide pour 'index'.
Nom du paramètre : index
j'ai beau essais des combinaison ça ne marche pas
le code d'origine avait après :
 ListView1.Items.RemoveAt(i)
Exit For

qui stop la suppression aprés l'avoir effectuer une seul fois
j'ai l'ai enlevé car je ne veux pas qu'il s'arrête jusqu'à il supprime toutes les lignes qui ne contient pas le mot dans la textbox2 (contenue dans la première colonne)
aidez moi s'il vous plaît

Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
3241
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 novembre 2018
3
Merci
Bonjour
Pourquoi pas ainsi

For i As Integer = ListView1.Items.Count - 1 to 0 step -1 
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
End If
Next

Merci cs_ShayW 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
Ça marche Merci beaucoup cs_ShayW
j'avais déja pensé à aller a l'envers (par exemple de 10 à 0)
mais ça n'a pas marcher, car je n'ai pas mis
Merci encore je te suis reconnais pour ton aide
Merci à vb95 et Whismeril pour leurs aides
Commenter la réponse de cs_ShayW
Messages postés
12371
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
1
Merci
Bonjour,

voici un exemple, je mets des Personnes dans la listview, puis je ne garde que ceux dont le nom de famille contient "jean"

'initialisation de la collection de données et l'affichage dans la Listview
			personnes = New List(Of Personne)()
			personnes.Add(New Personne With {.Nom = "Durand", .Prenom = "Jean-Paul"})
			personnes.Add(New Personne With {.Nom = "Jean", .Prenom = "Marcel"})
			personnes.Add(New Personne With {.Nom = "Durant", .Prenom = "Jean-Claude"})
			personnes.Add(New Personne With {.Nom = "Grandjean", .Prenom = "Edouard"})
			personnes.Add(New Personne With {.Nom = "Dupond", .Prenom = "Jean-Paul"})
			personnes.Add(New Personne With {.Nom = "Dupont", .Prenom = "Pierre-Jean"})

			For Each p As Personne In personnes
				listView1.Items.Add(p.ToString())
			Next p






		   'Dans un bouton (par exemple), je ne garde que ceux dont le nom de famille contient jean et ce quelque soit la casse
			Dim seulementLesJeans As List(Of Personne) = personnes.Where(Function(p) p.Nom.ToLower().Contains("jean")).ToList()

			listView1.Items.Clear()
			For Each p As Personne In seulementLesJeans
				listView1.Items.Add(p.ToString())
			Next p



'la classe personne toute simple
Class Personne

		Public Property Nom() As String
			get,set
		End Property
		Public Property Prenom() As String

		Public Overrides Function ToString() As String
			Return Prenom & " " & Nom
		End Function
   End Class
Whismeril
Messages postés
12371
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
A noter, qu'en Winform la Listview ne supporte pas le binding, alors il faut à chaque modif, recharger avec une boucle.
kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
ce code fonctionne très bien
à chaque clique du bouton il effacer la liste qui est déjà rempli, il la remplit à nouveau mais cette fois il la remplit juste avec les lignes qui contient le mot Jean
Merci pour ton aide
Whismeril
Messages postés
12371
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
> kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
Oui, en général, j'essaye de poster un code qui marche.
kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
> Whismeril
Messages postés
12371
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
hhhhhhh oui c'est vrais désolé
Commenter la réponse de Whismeril
Messages postés
12371
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
Bonjour,

Admettons que quand tu démarres, la liste contienne 20 éléments.
Tu en supprimes, un, puis deux, puis trois,..... puis 8, et à ce moment là tu arrives à l'index 12, qui n'existe plus......

Pour ton code, il est préférable d'utiliser une boucle Do.

Mais pour faire propre, il me semble t'avoir déjà dit de gérer tes données dans une collection (list(of), tableau, etc...), et de ne te servir des contrôles que pour l'affichage. Et alors une simple requête where suffirait
https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
j'avais déjà pensé a cette possibilité, je me suis dit que en mettant
 a = ListView1.Items.Count - 1

(a est déclaré en haut "
Dim a As Integer
")
dans l'évenment ListView1_CountChanged par exemple
et mettre le code suivant:
 For i As Integer = 0 To a
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
End If
Next

dans le bouton ça réglerait le problème, mais malheureusement il n'existe pas

 Mais pour faire propre, il me semble t'avoir déjà dit de gérer tes données dans une collection (list(of), tableau, etc...),

j'ai utilisé un ListView parce que j'ai plusieurs colonne et une ListView m'aide bien

Pour ton code, il est préférable d'utiliser une boucle Do.

tu ma dit que sa serait mieux si j'utilise une boucle do
alors j'ai utiliser la boucle do et do while
voici les deux codes :
Dim i As Integer = 0
Do While i <= ListView1.Items.Count - 1

If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
End If
Loop

Dim i As Integer = 0
Do
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
End If
Loop Until i > ListView1.Items.Count - 1

mais le problème est l'application se bloque et ne marche plus
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
bonsoir Kikou93 et un salut à Whismeril
voici tes deux codes :

Dim i As Integer = 0
Do While i <= ListView1.Items.Count - 1
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
' il manque quelque chose là
End If
Loop



Dim i As Integer = 0
Do
If Not ListView1.Items(i).Text.Contains(TextBox2.Text) Then
ListView1.Items.RemoveAt(i)
Else
' il manque quelque chose là
End If
Loop Until i > ListView1.Items.Count - 1


Réfléchis : si tu ne supprimes pas la ligne il faut passer à la suivante je crois ......
Quant au fait que tu utilises directement les données .Text contenues dans la listview je suis d'accord avec l'avis de Whismeril : une list(of ) structurée selon les variables contenues dans les colonnes et tu travailles directement sur la list(of) et tu ré-affiches la nouvelle listview
kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
> vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
Merci de m'avoir répondu vb95
je me suis dit par exemple :
si i = 1 et si il ne trouve pas le mot dans la ligne 1 alors il ne fait rien (d'ou le vide entre else et end if
et grace la la boucle Do la valeur de i devient i = 2, il vérifie la 2eme ligne et ainsi de suite
peut-être que j'ai mal compris comme ça fonctionne
vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
> kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
-
et non kikou93 la valeur de i ne change pas et c'est la ligne de code
i = i + 1
qu'il manque pour aller à la ligne suivante en modifiant le numéro de ligne . Par contre si tu supprimes la ligne i c'est la ligne i + 1 qui devient la nouvelle ligne i . Dans ce cas inutile de faire
i = i + 1

Sans cette ligne de code tu boucles en continu sur une ligne si tu ne la supprimes pas
kikou93
Messages postés
418
Date d'inscription
mardi 4 février 2014
Dernière intervention
24 septembre 2018
> vb95
Messages postés
1725
Date d'inscription
samedi 11 janvier 2014
Dernière intervention
11 décembre 2018
-
ah oui! j'ai compris ça parait plus comme ca
merci vb95
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.