Trier une listview

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 - 7 janv. 2007 à 21:21
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 8 janv. 2007 à 09:51
Salut,

       Je voudrais trier chacune des colonnes de ma listview par ordre croissant , puis décroissant et ainsi de suite. J'ai reussi à détecter le clic sur la colonne de la listview et récupérer l'index de la colonne cliquée. Mais là où j'ai des difficultés c'est de la trier alors, je voudrais si vous connaissiez un moyen de trier une listview selon la colonne cliquée (sans que le code soit trop long bien sur enfin si possible)

Merci

6 réponses

Profil bloqué
7 janv. 2007 à 23:31
Inspire toi de cet exemple : tu as tout pour trier une listview







SortKey, SortOrder, Sorted, propriétés,
ColumnClick, événement, exemple

Dans cet exemple, trois objets ColumnHeader sont ajoutés à un contrôle
ListView et ce dernier est rempli avec les enregistrements de la table
Publishers qui se trouve dans la base de données Biblio.mdb. Un tableau de deux
contrôles OptionButton offre deux choix pour le tri des enregistrements.
Quand vous cliquez sur un objet ColumnHeader, le contrôle ListView
est trié selon la valeur de la propriété SortOrder, telle que déterminée
par les contrôles OptionButton. Pour tester cet exemple, placez un objet
ListView et un tableau de deux contrôles OptionButton sur une
feuille et collez le code dans la section Déclarations de la feuille. Exécutez
l'exemple et cliquez sur ColumnHeaders pour effectuer le tri, puis
cliquez sur le contrôle OptionButton pour passer à l'autre valeur de la
propriété SortOrder.




Note
   Vous ne pouvez pas exécuter cet exemple si
vous n'avez pas ajouté une référence à la bibliothèques d'objets Microsoft
DAO 3.5 en cliquant sur Références dans le menu Projet



Private Sub Option1_Click(Index as Integer)
   ' Ces contrôles OptionButton offrent deux choix : Croissant
   ' (Index 0), et Décroissant (Index 1). Cliquez sur l'un
   ' d'eux pour définir l'ordre de tri du contrôle ListView.
   ListView1.SortOrder =  Index
   ListView1. Sorted   = True ' Trie la liste.
End Sub

Private Sub Form_Load()
   ' Crée une variable objet pour l'objet ColumnHeader.
   Dim clmX As ColumnHeader
   ' Ajoute une collection ColumnHeaders. La largeur des colonnes est 
   ' égale à celle du contrôle divisée par le nombre d'objets 
   ' ColumnHeader.
   Set clmX =  ListView1.ColumnHeaders. _
      Add(, , "Company", ListView1.Width / 3)
   Set clmX = ListView1.ColumnHeaders. _
      Add(, , "Address", ListView1.Width / 3)
   Set clmX = ListView1.ColumnHeaders. _
      Add(, , "Phone", ListView1.Width / 3)

   ' Définit la propriété BorderStyle.
   ListView1.BorderStyle = ccFixedSingle 
   ' Définit la vue Détails.
   ListView1.View = lvwReport 

' Légendes des contrôles OptionButton avec les options de tri.
      Option1(0).Caption = "Croissant (A-Z)"
      Option1(1).Caption = "Décroissant (Z-A)"
      ListView1 .SortOrder   = lvwAscending ' Tri croissant.

   ' Crée des variables objet pour les objets d'accès aux données.
   Dim myDb As Database, myRs As Recordset
   ' Spécifie BIBLIO.MDB comme base de données.
   Set myDb = DBEngine.Workspaces(0).OpenDatabase("BIBLIO.MDB")
   ' Spécifie la table Publishers comme jeu d'enregistrements.
   Set myRs = myDb.OpenRecordset("Publishers", dbOpenDynaset)

   ' Crée une variable pour ajouter des objets ListItem.
   Dim itmX As ListItem

   ' Quand l'enregistrement n'est pas le dernier,
   ' ajoute un objet ListItem.
   ' Utilise le champ Name pour le texte de l'objet ListItem.
   ' Utilise le champ Address pour le sous-élément(1)
   ' de l'objet ListItem.
   ' Utilise le Champ Telephone pour le sous-élément(2) de
   ' l'objet ListItem.

   While Not myRs.EOF
      Set itmX = ListView1.ListItems.Add(, , CStr(myRs!Name))

      ' Si le champ Address n'est pas nul, affecte sa
      ' valeur au sous-élément 1.
      If Not IsNull(myRs!Address) Then
         itmX.SubItems(1) = CStr(myRs!Address)  ' Champ Adress
      End If

      ' Si le Champ Telephone n'est pas nul, affecte 
      ' sa valeur au sous-élément 2.
      If Not IsNull(myRs!Telephone) Then
         itmX.SubItems(2) = myRs!Telephone  ' Champ Telephone.
      End If

      myRs.MoveNext   ' Passe à l'enregistrement suivant.
   Wend
End Sub

Private Sub ListView1_ ColumnClick (ByVal ColumnHeader As ColumnHeader)
   ' Quand vous cliquez sur un objet ColumnHeader, le contrôle
   ' ListView est trié selon les sous-éléments de cette colonne.
   ' Affecte à la propriété SortKey l'index de ColumnHeader - 1
   ListView1.SortKey  = ColumnHeader.Index - 1
   ' Affecte à la propriété Sorted la valeur True afin de trier la
   ' liste.
   ListView1.Sorted = True
End Sub






GRENIER Alain[8D]
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
7 janv. 2007 à 23:55
Salut,

         Merci de m'avoir répondu, mais j'ai quand même un souci SortKey, Sorted, SortOrder, je ne les ai absolument pas. D'après ce qu'est j'ai pu voir elle se trouve en VB6 moi je suis en VB 2005 et elle ne sont toujours pas apparu même après avoir ajouté la référence que tu as indiqué Microsoft DAO 3.5.

         Peut être as tu une autre solution car j'ai suivi ce que tu as marqué juste avant et je n'obtenais que des erreurs.

Merci et @+
0
Profil bloqué
8 janv. 2007 à 00:25
Microsoft DAO 3.5. n' a rien à voir avec les listviews : c'est pour les acces aux bases de données et l'exemple donné utilisait une base de données
Par contre excuse-moi car je n'ai pas fait attention au fait que tu avais spécifié VB 2005 : mea culpa
Et je n'y connais pas grand chose en VB 2005 pour ne pas dire rien
Je ne puis donc pas t'aider plus : désoé

GRENIER Alain[8D]
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
8 janv. 2007 à 06:03
Salut,

            Je te remercie de m'avoir essayer de m'aider.
@+
0

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

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
8 janv. 2007 à 09:48
Voilà en fait, on ne sait trier automatiquemement que selon la première colonne de ton listview, l'astuce : si tu dois trier selon la colone c, tu permute tes colonnes jusqu'à ce que c soit devant, tu trie, puis tu permute jusqu'à revenir comme avant... Voici un code :

Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
For i As Integer = 0 To ListView1.Items.Count
If i = e.Column Then
If ListView1.Columns(e.Column).Tag <> "A" Then
ListView1.Sorting = SortOrder.Ascending
ListView1.Columns(e.Column).Tag = "A"
Else
ListView1.Sorting = SortOrder.Descending
ListView1.Columns(e.Column).Tag = "D"
End If
Else
ListView1.Sorting = SortOrder.None
End If
PermuterListView(ListView1)
Next
End Sub

Sub PermuterListView(ByVal lv As ListView)
Dim t As String
For i As Integer = 0 To lv.Items.Count - 1
With lv.Items(i)
t = .Text
.Text = .SubItems(0).Text
.SubItems.RemoveAt(0)
.SubItems.Add(t)
End With
Next
End Sub

Je me sers de Column(e.Column).Tag pour voir si on doit la trier par ordre croissant ou décroissant.

Remarque : Fais attention qu'il traite tes éléments comme des strings, cela veut dire qu'il te mettra un "5" après un "18", si tu dois trier selon des nombres, pense à utiliser format avant et après le tri (afin de transformer ton "5" en "00000005" puis de le remettre en "5" après...)

Julien.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
8 janv. 2007 à 09:51
(Le code est pas beau comme ca et je meurs d'envie d'utiliser la coloration de Kenji, alors voila :p)

  Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    For i As Integer = 0 To ListView1.Items.Count
      If i = e.Column Then
        If ListView1.Columns(e.Column).Tag <> "A" Then
          ListView1.Sorting = SortOrder.Ascending
          ListView1.Columns(e.Column).Tag = "A"
        Else
          ListView1.Sorting = SortOrder.Descending
          ListView1.Columns(e.Column).Tag = "D"
        End If
      Else
        ListView1.Sorting = SortOrder.None
      End If
      PermuterListView(ListView1)
    Next
  End Sub

  Sub PermuterListView(ByVal lv As ListView)
    Dim t As String
    For i As Integer = 0 To lv.Items.Count - 1
      With lv.Items(i)
        t = .Text
        .Text = .SubItems(0).Text
        .SubItems.RemoveAt(0)
        .SubItems.Add(t)
      End With
    Next
  End Sub, ----
(Coloration syntaxique automatique par Kenji)

Julien.
0
Rejoignez-nous