Au sujet du contrôle listView suppression ligne(s)
Tanaka56
Messages postés124Date d'inscriptionsamedi 8 avril 2006StatutMembreDernière intervention29 janvier 2009
-
6 juin 2006 à 16:54
addamsmercredi
Messages postés121Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention27 juillet 2006
-
6 juin 2006 à 20:15
Bonjour à tous.
Sur mon contrôle "ListView1" j'ai coché MultiSelect.Je peux donc sélectionner une où plusieurs lignes soit contigus ou pas.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
Seulement comment les supprimer après les avoir sélectionnées?
Merci de vos réponses.
Cordialement.
A voir également:
Au sujet du contrôle listView suppression ligne(s)
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 6 juin 2006 à 17:24
Salut,
Essaie un truc du genre:
Dim i As Integer
For i = ListView1.ListItems.Count To 1 Step -1
If ListView1.ListItems(i).Selected Then
Call ListView1.ListItems.Remove(i)
End If
Next
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 juin 2006 à 17:46
celle ci est plus rapide:
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
Dim i As Integer
For i = ListView1.ListItems.Count To 1 Step -1
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 juin 2006 à 19:00
en fait, il semblerait que le nombre de PostMessage est limité à 10000
en dessous de 10000 pas de problème, pas de moment d'attente, pour la vitesse il y a pas photo, 50 fois plus rapide,
tous les "remove" se faisant à la fin.
au dessus de 10000, il faut insérer des Doevents, et là on perd pas mal
de temps, mais dans l'ensemble c'est encore un peu plus rapide.
à noter aussi le i-1 dans PostMessage
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
Dim i AsLong
For i = ListView1.ListItems.Count To 1 Step -1
If ListView1.ListItems(i).Selected Then
PostMessage ListView1.hwnd, &H1008&, i - 1, 0
addamsmercredi
Messages postés121Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention27 juillet 2006 6 juin 2006 à 19:52
Je n'ai pas comparé la rapidité de Remove avec PostMessage car je ne connaissais pas cette dernière et je n'ai pas VB.NET ni VB 2005 ici pour tester (je les ai seulement au travail).
Mais ce dont je suis sûr car déjà testé et retesté, c'est que pour parcourir une listview, il faut absoluement éviter d'utiliser une boucle du genre "For i ListView1.ListItems.Count To 1 Step -1" ou "For i ListView1.ListItems.Count To 1 Step -1" car c'est affreusement long à cause de l'instruction "ListView1.ListItems(i)".
Une boucle "For Each" est beaucoup beaucoup plus rapide ! Il n'y a pas photo !
De plus, ce n'est pas forcément judicieux de parcourir toutes les lignes pour ne concerver que celles qui sont sélectionnées, il suffit de parcourir seulement les lignes sélectionnées.
Ma méthode couplée à la fonction PostMessage donnerait sûrement une version bien plus rapide.