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

kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 7 sept. 2016 à 17:58 - Dernière réponse : kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention
- 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 

13 réponses

Répondre au sujet
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 7/09/2016 à 21:28
+3
Utile
1
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
Cette réponse vous a-t-elle aidé ?  
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 7 sept. 2016 à 21:43
Ç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
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 8 sept. 2016 à 14:46
+1
Utile
4
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 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 8 sept. 2016 à 14:47
A noter, qu'en Winform la Listview ne supporte pas le binding, alors il faut à chaque modif, recharger avec une boucle.
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 8 sept. 2016 à 15:21
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 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 8 sept. 2016 à 21:28
Oui, en général, j'essaye de poster un code qui marche.
kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 8 sept. 2016 à 22:23
hhhhhhh oui c'est vrais désolé
Commenter la réponse de Whismeril
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 7 sept. 2016 à 18:32
0
Utile
5
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 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 7 sept. 2016 à 19:14
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 7 sept. 2016 à 20:38
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 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 7 sept. 2016 à 21:26
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 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention > kikou93 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention - 7 sept. 2016 à 21:54
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 399 Messages postés mardi 4 février 2014Date d'inscription 13 avril 2018 Dernière intervention > vb95 1504 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 7 sept. 2016 à 22:25
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.