Au sujet du contrôle listView suppression ligne(s)

Tanaka56 Messages postés 124 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 29 janvier 2009 - 6 juin 2006 à 16:54
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 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.




 

8 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
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 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

ATTENTION les items ont été ajoutés sans index, peu être que cela change si tu les ajoutes avec des index

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 juillet 2006
6 juin 2006 à 17:29
Lorsqu'il y a beaucoup de lignes, la méthode suivante est beaucoup plus rapide :


Dim item As ListViewItem
For Each item In ListView1.SelectedItems
   ListView1.Items.Remove(item)
Next
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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 

      If ListView1.ListItems(i).Selected Then 

          PostMessage Listview1.hwnd, &H1008&, i, 0

      End If 
Next

Daniel
0
Tanaka56 Messages postés 124 Date d'inscription samedi 8 avril 2006 Statut Membre Dernière intervention 29 janvier 2009
6 juin 2006 à 18:46
Merci à tous pour vos solutions.
Cordialement.
Alain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

          If (i And &H1FFF&) = 0 Then DoEvents

      End If 
Next

Daniel
0
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 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.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 juin 2006 à 20:01
le problème c'est qu'ici cest VB6

donc pas de collection pour la ListView

et ta solution ne marche pas

Daniel
0
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 juillet 2006
6 juin 2006 à 20:15
Oups désolé, je pensais que les listview n'existaient pas sur VB6 donc j'ai tout de suite pensé que c'était sous VB.NET ou VB 2005. Désolé.
0
Rejoignez-nous