Tri des items de listview (date, numérique ou perso)

Soyez le premier à donner votre avis sur cette source.

Vue 10 444 fois - Téléchargée 1 118 fois

Description

Une petite source qui montre comment trier efficacement (et facilement)
les colonnes de vos ListView.

Une seule ligne a ajouter pour qu'enfin vous puissiez trier les colonnes de numériques, de dates... ou appliquer un tri personnalisé (nécessite que vous modifiez le code du module)
Certains me diront que la propriété Sorted est là pour ça...
oui, sauf que celle-ci effectue un tri par ordre alphabétique:
(0 <1 <10 <11 <2 <20 ...)

Encore une API mise a portée de VB. On demande simplement a effectuer le tri des elements. Windows appelle ensuite notre fonction de tri perso, en nous indiquant une paire d'elements a tester.

tout ce que nous avons a faire, c'est renvoyer :

-1 => premier element a placer avant le deuxieme
0 => elements identiques
1 => second element a placer avant le premier

Source / Exemple :


Private Sub HandleColumnClick(ByRef voListView As ListView, ByRef voColumnHeader As ColumnHeader, Optional voImageList As ImageList)
Dim oColumn As ColumnHeader
    If Not Nothing Is voListView And Not Nothing Is voColumnHeader Then
        With voListView
            '# A-t'on cliqué sur la colonne sur laquelle le tri est déjà effectué ?
            If .SortKey = voColumnHeader.Index - 1 Then
                '# en ce cas... on inverse le tri
                .SortOrder = 1 - .SortOrder
            Else
                '# tri croissant sur la colonne cliquée
                .SortKey = voColumnHeader.Index - 1
                .SortOrder = lvwAscending
            End If
            Set .ColumnHeaderIcons = voImageList
            '# Si la liste est renseignée, on met a jour les icones
            If Not Nothing Is voImageList Then
                For Each oColumn In .ColumnHeaders
                    If oColumn Is voColumnHeader Then
                        '# les icones sont stockées ainsi dans l'imagelist:
                        '# 1=> ASC ; 2=>DESC
                        oColumn.Icon = .SortOrder + 1
                    Else
                        '# on supprime l'icone
                        oColumn.Icon = 0
                    End If
                Next oColumn
            End If
        End With
    End If
End Sub

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut,
Merci pour ta réponse, dommage....
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
voir ma reponse precedante... typiquement le même cas
Messages postés
19
Date d'inscription
mercredi 23 mars 2005
Statut
Membre
Dernière intervention
8 février 2015

Salut Renfield,
Super ton code, malheureusement, je n'ai pas trouvé le moyen de conserver la couleur (forecolor) de la ligne associée (déplacer la couleur avec la ligne)dans ton tri personnalisé (Listview2).
Si par exemple on met un .forecolor = vbred à l'item Text:="1", le "1" de la ligne 1 est bien en rouge, mais après un tri dans Listview2, le "1" change de ligne et de couleur, et la première ligne conserve la couleur rouge.
As-tu une solution ??
Merci
Jean
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
Il faut bien garder une chose à l'esprit.

ce qu'on place dans notre Form est un OCX.
cet OCX instancie une fenetre windows de type ListView32.

le tri se passe parfaitement bien, manipulant directement la fenetre via la hWnd.

l'OCX, lui est une couche supplementaire entre nous et ladite fenetre.
lorsque nous jouons avec la fenetre, certaines de ces propriétés ne suivent pas.

c'est le cas pour le SelectedItem, qui est surement géré "localement", dans l'OCX
le cas aussi pour le tag ou autres attributs supplémentaires.
Messages postés
65
Date d'inscription
mardi 18 février 2003
Statut
Membre
Dernière intervention
11 avril 2009

Salut:
complément d'info, car j'ai tout de meme repris le code, avec ajouts de "rustines" pour par exemple retrouver un item précis :
j'ajoute une colonne "id" masquée avec un width=0, puis un vilain for each pour retrouver l'id cherché, au lieu d'un simple lvwControl.ListItems(monID). Bref ...
Autre BUG avec l'Event ItemClick:
Private Sub lvwControl_ItemClick(ByVal Item As Object)
'Essai donc ça :
Debug.Print "Item.Text: " & Item.Text
Debug.Print "LVW SelectedItem: " & lvwControl.SelectedItem.Text
Surprise ! Item est censé etre la nouvelle sélection, n'est ce pas... ben pas là!

bonne reflexion :)
++
Afficher les 13 commentaires

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.