en gros, quand tu actives la propriété Sorted de ton ListView, et en jouant avec SortOrder et SortKey, il est capable de trier tes colonnes.
normallement, on fait:
Private Sub ListView2_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
If ListView2.SortKey = ColumnHeader.Index - 1 Then
'# on inverse le tri
ListView2.SortOrder = IIf(ListView2.SortOrder = lvwAscending, lvwDescending, lvwAscending)
Else
'# tri croissant sur la colonne cliquée
ListView2.SortKey = ColumnHeader.Index - 1
ListView2.SortOrder = lvwAscending
End If
End Sub
et hop ! le tri est fait, en cliquant sur les colonnes, etc. ca roule.
enfin.... presque.
le tri joue bêtement avec la table ascii (tri alphabétique)
En faisant la même chose, mais en désactivant la propriété Sorted, il suffit d'ajouter cette ligne:
SortListView ListView2, eType
pour être en mesure de trier nous meme les elements.
eType nous permet d'aller au plus prêt: spécifier le type de colonne a laquelle on a affaire (date, numérique, string ...)
toi, tu cherche a effectuer un tri perso, tu peux mettre ici la valeur que tu souhaites (négative, par exemple...)
et modifier la function CompareFunc (dans le module1) pour personnaliser ton tri.
tu as juste a renvoyer -1, 0 ou 1 comme indiqué en description de ma source.
en gros, faire:
SortListView ListView2, -99 '# valeur indiquant qu'il faut trier "~" "&" "@" "%" "+" puis un tri alphabétique
et dans la CompareProc, donc:
Select Case meDataType
Case -99
CompareProc = maComparaisonPerso(sItem1, sItem2)
Case vbSingle.....
[...]
End Select
End Function
Private Function maComparaisonPerso(Byref vsItem1 As String, Byref vsItem2 As String) as Long
[...] '# Ici comparer les deux mots
End Function
le test est aisé...
tu boucle sur les caractères de chaque mot.
si sChar1 <> sChar2 Alors
Select case sChar1
Case "~": nVal1 = -20
Case "&": nVal1 = -19
Case "@": nVal1 = -18
Case "%": nVal1 = -17
Case "+": nVal1 = -16
Case Else: nVal1 = Asc(sChar1)
End Select
'# idem pour sChar2 (et nVal2, donc)
Compare = sgn(nVal1 - nVal2)
Exit Function
End If
Loop
++
|