Trier un listview en VB.NET [Résolu]

Signaler
Messages postés
52
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008
-
Messages postés
52
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008
-
Bonjour à tous,

J'ai fait des recherches ... infructueuses malheureusement .. concernant ce soucis :
En VB.NET 2005 J'ai un listview avec 5 colonnes.
Avec l'événement ColumnClick je veux trier mon listview. Mais je ne parviens à ne trier que la première colonne quelque soit l'en-tête sur lequel je click.

Mon code est celui-ci :
    Private Sub LVResultat_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles LVResultat.ColumnClick
        Select Case e.Column
            Case 0

                If Me.LVResultat.Sorting = SortOrder.Ascending Then
                    Me.LVResultat.Sorting = SortOrder.Descending
                Else
                    Me.LVResultat.Sorting = SortOrder.Ascending
                End If

            Case Else
                Exit Select
        End Select

    End Sub
Comment utliser ma variable e.column pour trier la bonne colonne.
La doc microsoft indique qu'il faut créer une classe ListViewItemComparer basé sur une implémentation de IComparer.Compare mais je trouve cela un peu compliqué pour une tâche simple.

Quelqu'un a-t-il déjà réfléchi à cette question ?

Deuxième soucis :
Ma listview est rempli avec des données venant d'une BD. J'ai une requête simple avec une Clause ORDER BY. Et là plus aucun tri possible avec le code ci-dessus! oups!

Merci de votre aide

7 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
compliqué ?

l'exemple donné sur la MSDN ne semble pas l'être...
lien:http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemwindowsformslistviewclasslistviewitemsortertopic.asp

' ColumnClick event handler.
Private Sub ColumnClick(ByVal o As Object, ByVal e As ColumnClickEventArgs)
' Set the ListViewItemSorter property to a new ListViewItemComparer
' object. Setting this property immediately sorts the
' ListView using the ListViewItemComparer object.
Me.listView1.ListViewItemSorter = New ListViewItemComparer(e.Column)
End Sub

End Class

' Implements the manual sorting of items by columns.
Class ListViewItemComparer
Implements IComparer

Private col As Integer

Public Sub New()
col = 0
End Sub

Public Sub New(ByVal column As Integer)
col = column
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements IComparer.Compare
Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
End Function
End Class


Ca apporte une certaine souplesse de faire ainsi...
je vois pas pourquoi tu cherches midi à quatorze heures.
Messages postés
52
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

re
oubliez la deuxième question ... ça marche
reste la première
Messages postés
52
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

J'ai bien la même doc. et je vais sûrement me rabattre dessus.
Je trouve ça un peu compliqué de créer une fonction .. et même une classe .. pour une fonctionnalité qui devrait être de base dans un controle comme le listview. en VB6 il ne suffisait de dire quelle colonne on voulait trier? mais je me trompe peut-être...
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
non, il suffisait effectivement de modifier le SortKey.

mais avec ce grand désavantage d'être géné avec des colonnes qui contiennent des valeurs numériques, des dates, etc...

1
10
11
2
20
21
...

ou bien

01/02/2008
11/04/2008
12/03/2008
...
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Plus complexe en .NEt qu'en VB6, peut-être mais cela est bcp plus puissant, puisque tu peux définir toi-même la façon dont seront trié les données
Messages postés
52
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

Bon je m'incline...
j'ai rempris l'exemple de la do msdn et j'ai mis ça dans l'événement click :
        Static OrdreDeTri As System.Windows.Forms.SortOrder
        OrdreDeTri = 1 - OrdreDeTri
        Me.LVResultat.ListViewItemSorter = New ListViewComparer(e.Column, OrdreDeTri)

ça marche nikel
Merci à tous