Supp des lignes d'une ListView qui ne contient pas un motprécis

Résolu
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 - 7 sept. 2016 à 17:58
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre 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

3 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 7/09/2016 à 21:28
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
3
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
8 sept. 2016 à 14:46
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
1
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
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.
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
8 sept. 2016 à 21:28
Oui, en général, j'essaye de poster un code qui marche.
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
8 sept. 2016 à 22:23
hhhhhhh oui c'est vrais désolé
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 sept. 2016 à 18:32
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
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
Modifié par vb95 le 7/09/2016 à 20:45
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
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
Modifié par vb95 le 7/09/2016 à 22:03
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
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
7 sept. 2016 à 22:25
ah oui! j'ai compris ça parait plus comme ca
merci vb95
0
Rejoignez-nous