IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Tri par ordre croissant dans une listview


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut Tri par ordre croissant dans une listview
    Bonjour à tous,

    Mon programme tourne bien maintenant mais j'ai un petit souci pour le tri dans m'a listview avec plusieurs colonnes.

    Les colonnes sont:
    L'identifiant = un nom
    L'index = un chiffre
    Une date de début du fichier = un format date et heure
    Une date de fin du fichier = un format date et heure

    Pour le tri sur les nom pas de souci, pour les dates non plus après avoir formaté en format japonais.
    Il me reste l'index. Cela marche bien mais le tri se fait sous la forme:
    1
    10
    11
    12
    2
    20
    21
    3

    etc...

    Et j'aimerais que le tri soit plus logique en:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    etc...

    Merci

  2. #2
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Au lieu d'avoir comme index les chiffres "1, 2, 3, 4, 5, 6, 7, 8, 9", met un "0" devant, genre "01, 02, 03, 04, 05, 06, 07, 08, 09", et si tu ne veux pas que cela t'affiche le "0" lies alors tes index à une clé et tu fais le tri sur cette clé.

    1 --> 01
    2 --> 02
    3 --> 03
    ...
    ...
    ...
    10 --> 10

    etc ...
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par methylene Voir le message
    Au lieu d'avoir comme index les chiffres "1, 2, 3, 4, 5, 6, 7, 8, 9", met un "0" devant, genre "01, 02, 03, 04, 05, 06, 07, 08, 09", et si tu ne veux pas que cela t'affiche le "0" lies alors tes index à une clé et tu fais le tri sur cette clé.

    1 --> 01
    2 --> 02
    3 --> 03
    ...
    ...
    ...
    10 --> 10

    etc ...
    J'avais bien pensé à faire ça, mais il se peut que j'aille à plus de 1000 index avec le temps, donc il faudrait mettre 0001 voir plus, ce n'est pas très esthétique. Il n'y a pas d'autre moyen ?

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Et bien il y a cette solution qui est viable.

    Sinon, avec un peu de recherche google tu aurais vu que déjà discuter sur ce même forum, et qu'il faut faire ton propre tri:

    http://www.developpez.net/forums/d18...-listview-int/
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre régulier Avatar de simotaqi
    Inscrit en
    Février 2010
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 144
    Points : 117
    Points
    117
    Par défaut
    Essaie d'abord d'utiliser Val pour les Num pour trier leur valeur non leur string ^^
    Tous les chemins menent a la connaissance. Lequel est le plus court?
    de meme , Tous les chemins menent a l'ignorance, Lequel est le plus long?


    -------- ^ ^----------
    ------SMOoOTQ-------
    ---------( - )---------

  6. #6
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Et bien il y a cette solution qui est viable.

    Sinon, avec un peu de recherche google tu aurais vu que déjà discuter sur ce même forum, et qu'il faut faire ton propre tri:

    http://www.developpez.net/forums/d18...-listview-int/
    Merci pour le lien, je n'était pas tomber dessus dans google.

    Quand à Val cela marche pas non plus.

    Je vais essayer le code du lien

  7. #7
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Après quelques modifications pas bien méchante du code énoncé plus haut pour faire mon tri, cela marche impeccable.

    par contre j'ai un petit souci dans la gestion de l'évènement de visual:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _
                        ByVal e As System.Windows.Forms.ColumnClickEventArgs)                                       Handles ListView1.ColumnClick   
     
            If Me.ListView1.Sorting = SortOrder.Ascending Then
                Me.ListView1.Sorting = SortOrder.Descending
            Else
                Me.ListView1.Sorting = SortOrder.Ascending
            End If
            Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)
    End Sub
    Mon souci c'est que lorsque je clique sur l'une des colonnes il me fait plusieurs fois l'évènement et de quantité aléatoire. Du coup je n'alterne pas forcement le sens du tri.

    J'ai essayé de mettre en commentaire le "Handles ListView1.ColumnClick" de la déclaration, et la cela marche nickel mais parfois Visual me crée un nouveau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _
       ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick                                   
     
    End Sub
    Avec rien dedans donc erreur puisque la méthode est double.

    Avez vous une explication a ce phénomène de redondance et comment y remédier?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Points : 347
    Points
    347
    Par défaut
    C'est logique. En fait, quand tu vas sur le concepteur de vue de ta fenêtre et que tu vas sur les propriétés de ta liste, regarde les événements. Tu dois avoir dans Column_Click le nom de cette fonction et étant donné que tu mets en commentaires le handles dans ta première fonction, pour l'interpréteur il faut recréer la méthode. Enfin je pense ^^

  9. #9
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par sebnantes Voir le message
    C'est logique. En fait, quand tu vas sur le concepteur de vue de ta fenêtre et que tu vas sur les propriétés de ta liste, regarde les événements. Tu dois avoir dans Column_Click le nom de cette fonction et étant donné que tu mets en commentaires le handles dans ta première fonction, pour l'interpréteur il faut recréer la méthode. Enfin je pense ^^

    Je pense aussi, lorsque je le met en commentaire, pour lui ce n'est plus la même chose donc il le recrée, mais seulement une fois de temps en temps ce qui n'est pas tellement logique, soit il le recrée soit il le recrée pas.

    Par contre y a t'il un moyen propre pour qu'il traite l'évènement qu'une fois et non pas un nombre de fois aléatoire. Même si mettre en commentaire (ou supprimer) le handles... cela fonctionne, si parfois il recrée une méthode vierge c'est surement qu'il y a quelque chose qui lui convient pas.

  10. #10
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Déjà ton "Handles" s'est perdu à l'autre bout du code, enfin pas grave :p.

    Ensuite à quoi sert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)
    End Sub
    Et si je comprend bien quand tu click pour trier, cela te rajoute un nouveau évènement?
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Points : 347
    Points
    347
    Par défaut
    En fait, j'ai déjà rencontré ce problème pour une listeActiveX et je peux t'assurer que ça a été la loose...j'ai dû géré ce genre de problème à l'aide de booléen, et de compteur...Mais il se peut qu'il y ait une fonction qui te le permette mais je n'en sais rien

  12. #12
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Je viens de constater qu'en enlevant le handles... cela ne résout pas mon problème avec une liste plus importante, donc fausse piste pour moi.

    Quant à Visual qui me recrée une méthode évènement, effectivement il recrée une nouvelle méthode aléatoirement. Je m'explique:

    Dans un 1er temps j'ai créé l'évènement ListView1_ColumnClick en allant dans les propriétés de l'objet puis les évènements et en double cliquant dans la combobox vide à côté de ColumnClick.

    L'évènement crée j'ai ajouté le code que j'ai trouvé dans le lien donner par mactwist69 un peut plus haut
    http://www.developpez.net/forums/d18...-listview-int/

    Grace à ce lien j'ai crée une classe ListViewItemComparer

    Elle dispose de la méthode qui fait le tri.

    J'ai fait quelques modifs pas bien méchante pour que la méthode fonctionne, car il y a quelques erreurs et j'ai constaté que cela marche impeccable, je n'est d'ailleurs même plus besoin de mettre mes dates au format japonais.

    Mais mon problème c'est que grâce aux instructions dans l'évènement on devrait alterner le tri ascendant ou descendant à chaque clic. Mais vu qu'à chaque clic il y a plusieurs fois le même évènement qui se lance à la suite en nombre aléatoire, l'alternance entre les tris ascendant ou descendant est caduque.

    En enlevant le handle... l'évènement se faisait qu'une fois sur m'a petite liste, Par contre lorsque je lance le programme, de temps en temps Visual me recrée une méthode identique de l'évènement mais de nouveau avec le handle...
    Maintenant je viens de constater qu'avec une liste plus importante dans la listView l'évènement ColumnClic est quand même lancé plusieurs fois même sans le handle... donc même souci.

    Pour simplifier je pourrais faire qu'un tri ascendant, cela suffirait, mais je voudrais comprendre pourquoi cela fait plusieurs fois l'évènement, car je retrouverais surement cette situation dans l'avenir.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Points : 347
    Points
    347
    Par défaut
    Juste pour voir si ton événement se déclenche sur la même colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(e.columnHeader.Index)
    Et regarde si le résultat de l'index est le même mais surtout le bon.

    P.S. : Félicitation pour ton acceptation en BTS !!

  14. #14
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par sebnantes Voir le message
    Juste pour voir si ton événement se déclenche sur la même colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox(e.columnHeader.Index)
    Et regarde si le résultat de l'index est le même mais surtout le bon.

    P.S. : Félicitation pour ton acceptation en BTS !!
    Merci,

    J'ai un peut changer le code car il ne connait pas e.columnHeader.Index

    Par celui-çi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _
                        ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick 
     
            Me.ListView1.Sorting = SortOrder.Ascending
            Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)
            MsgBox(e.Column.ToString) ' columnHeader.Index)
     
        End Sub
    Et effectivement c'est la même colonne et bien celle qui m'intéresse.

    Pour le moment j'ai donc éliminé la possibilité d'être descendant, mais j'aimerais bien comprendre le pourquoi de la chose

  15. #15
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Quand j'ai des problèmes d'évènement qui peut se déclencher plusieurs fois (généralement à cause de Threads), j'utilise un boolean.

    Dans ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Bloque as boolean
     
    Private Sub Form_Load
     
         Bloque =False
     
    End Sub
     
    Private Sub Mon_Evenement
     
     
     If Not Bloque
     
           Try
     
     
                Bloque = True
     
                 'Code
     
                 Bloque = False
     
     
           Catch
     
           Bloque=False
     
           End Try
     End If
    End Sub
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Points : 347
    Points
    347
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Quand j'ai des problèmes d'évènement qui peut se déclencher plusieurs fois (généralement à cause de Threads), j'utilise un boolean.

    Dans ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Bloque as boolean
     
    Private Sub Form_Load
     
         Bloque =False
     
    End Sub
     
    Private Sub Mon_Evenement
     
     
     If Not Bloque
     
           Try
     
     
                Bloque = True
     
                 'Code
     
                 Bloque = False
     
     
           Catch
     
           Bloque=False
     
           End Try
     End If
    End Sub
    C'est ce que j'ai dû faire pour le problème dont je parlais plus haut...Et je n'en avais pas qu'un à gérer, plus des choses à garder en mémoire etc, etc...Mario, c'est une solution "sûr" car au moins, tu bloques l'accès à l'événement, par contre, il faut que tu trouves le bon endroit pour réinitialiser ton booléen ^^ Mais il doit quand même bien y avoir un moyen plus simple pour stopper un événement autrement...

  17. #17
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    je n'est que mon thread principal, aucune gestion de plusieurs thread donc.

    Ce qui me surprend c'est que j'ai 2 fichiers de test actuellement pour remplir m'a listview l'une fait une 10éne de ligne et l'autre j'en ai plus de 30. Sur l'a petite liste dans la listview il fait 2 fois l'évènement, sur la grosse il le fait 4 à 5 fois

    Je vais tenter à mes moments perdu avec la version 2010 si c'est un éventuelle bug qui serait corrigé.

  18. #18
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Que tu crois que tu as que ton thread principal... Visual Studio en utilise lui même plusieurs. Parfois un évènement en déclenche un autre... à ce moment précis deux code parallèle peuvent fonctionné.

    Je crois que tu conclues un peu vite que c'est un "bug" de microsoft.

    As tu au moins essayer de faire fonctionner ton code au pas à pas pour voir ce qui se passe ?

    Parfois ça semble invraisemblable mais a 99%, y'a un truc qu'on rate.

    Par exemple... tu pourrais montrer ton code qui remplis la listview...
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    voir ce lien MSDN
    http://msdn.microsoft.com/fr-fr/libr...8VS.80%29.aspx
    Je l'ai à peine modifié pour indiquer les colonnes que l'on veut "numeric" pour le tri.

    La classe pour le tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
        ' An instance of the SortWrapper class is created for 
        ' each item and added to the ArrayList for sorting.
        Public Class SortWrapper
            Friend sortItem As ListViewItem
            Friend sortColumn As Integer
     
            ' A SortWrapper requires the item and the index of the clicked column.
            Public Sub New(ByVal Item As ListViewItem, ByVal iColumn As Integer)
                sortItem = Item
                sortColumn = iColumn
            End Sub
     
            ' Text property for getting the text of an item.
            Public ReadOnly Property [Text]() As String
                Get
                    Return sortItem.SubItems(sortColumn).Text
                End Get
            End Property
     
            ' Implementation of the IComparer 
            ' interface for sorting ArrayList items.
            Public Class SortComparer
                Implements IComparer
                Private ascending As Boolean
                Private numeric As Boolean
     
                ' Constructor requires the sort order;
                ' true if ascending, otherwise descending.
                Public Sub New(ByVal asc As Boolean, ByVal num As Boolean)
                    Me.ascending = asc
                    Me.numeric = num
                End Sub
     
                ' Implemnentation of the IComparer:Compare 
                ' method for comparing two objects.
                Public Function [Compare](ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
                    Dim xItem As SortWrapper = CType(x, SortWrapper)
                    Dim yItem As SortWrapper = CType(y, SortWrapper)
     
                    If Me.numeric Then
                        Dim xText As Integer = CInt(xItem.sortItem.SubItems(xItem.sortColumn).Text)
                        Dim yText As Integer = CInt(yItem.sortItem.SubItems(yItem.sortColumn).Text)
                        If Me.ascending Then
                            Return xText.CompareTo(yText) * 1
                        Else
                            Return xText.CompareTo(yText) * -1
                        End If
                    Else
                        Dim xText As String = xItem.sortItem.SubItems(xItem.sortColumn).Text
                        Dim yText As String = yItem.sortItem.SubItems(yItem.sortColumn).Text
                        If Me.ascending Then
                            Return xText.CompareTo(yText) * 1
                        Else
                            Return xText.CompareTo(yText) * -1
                        End If
                    End If
     
                End Function
            End Class
        End Class
    la classe pour construire les colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        ' The ColHeader class is a ColumnHeader object with an 
        ' added property for determining an ascending or descending sort.
        ' True specifies an ascending order, false specifies a descending order.
        ' Et une propriété pour déterminer si la colonne est numérique.
        Public Class ColHeader
            Inherits ColumnHeader
            Public ascending As Boolean
            Public numeric As Boolean
     
            Public Sub New(ByVal [text] As String, ByVal width As Integer, ByVal align As HorizontalAlignment, ByVal asc As Boolean, _
                           ByVal num As Boolean)
                Me.Text = [text]
                Me.Width = width
                Me.TextAlign = align
                Me.ascending = asc
                Me.numeric = num
            End Sub
        End Class
    Un exemple pour peupler le Listview avec la classe précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            ' Set to Details view.
            Me.ListView1.View = View.Details
     
            ' Add columns using the ColHeader class. The fourth    
            ' parameter specifies true for an ascending sort order.
            ListView1.Columns.Add(New ColHeader("Name", 110, HorizontalAlignment.Left, True, False))
            ListView1.Columns.Add(New ColHeader("Index", 50, HorizontalAlignment.Left, True, True))
            ListView1.Columns.Add(New ColHeader("Sales", 70, HorizontalAlignment.Left, True, False))
     
            ' Add the data.
            ListView1.Items.Add(New ListViewItem(New String() {"Archer, Karen", "1", "0521.28"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Benson, Max", "12", "0828.54"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Bezio, Marin", "3", "0535.22"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Higa, Sidney", "2", "0987.50"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Martin, Linda", "6", "1122.12"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Nash, Mike", "7", "1030.11"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Sanchez, Ken", "10", "0958.78"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Smith, Ben", "5", "0763.25"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Arch, Karen", "4", "0521.28"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Ben, Max", "20", "0828.54"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Bezi, Marin", "30", "0535.22"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Hig, Sidney", "21", "0987.50"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Mart, Linda", "8", "1122.12"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Nashin, Mike", "9", "1030.11"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Sancho, Ken", "15", "0958.78"}))
            ListView1.Items.Add(New ListViewItem(New String() {"Smithder, Ben", "22", "0763.25"}))
            ' Connect the ListView.ColumnClick event to the ColumnClick event handler.
            AddHandler Me.ListView1.ColumnClick, AddressOf listView1_ColumnClick
        End Sub
    et enfin le code pour lancer le tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        Private Sub listView1_ColumnClick(ByVal sender As Object, ByVal e As ColumnClickEventArgs)
     
            ' Create an instance of the ColHeader class. 
            Dim clickedCol As ColHeader = CType(Me.listView1.Columns(e.Column), ColHeader)
     
            ' Set the ascending property to sort in the opposite order.
            clickedCol.ascending = Not clickedCol.ascending
     
            ' Get the number of items in the list.
            Dim numItems As Integer = Me.listView1.Items.Count
     
            ' Turn off display while data is repoplulated.
            Me.listView1.BeginUpdate()
     
            ' Populate an ArrayList with a SortWrapper of each list item.
            Dim SortArray As New ArrayList
            Dim i As Integer
            For i = 0 To numItems - 1
                SortArray.Add(New SortWrapper(Me.listView1.Items(i), e.Column))
            Next i
     
            ' Sort the elements in the ArrayList using a new instance of the SortComparer
            ' class. The parameters are the starting index, the length of the range to sort,
            ' and the IComparer implementation to use for comparing elements. Note that
            ' the IComparer implementation (SortComparer) requires the sort  
            ' direction for its constructor; true if ascending, othwise false.
            SortArray.Sort(0, SortArray.Count, New SortWrapper.SortComparer(clickedCol.ascending, clickedCol.numeric))
     
            ' Clear the list, and repopulate with the sorted items.
            Me.listView1.Items.Clear()
            Dim z As Integer
            For z = 0 To numItems - 1
                Me.listView1.Items.Add(CType(SortArray(z), SortWrapper).sortItem)
            Next z
            ' Turn display back on.
            Me.listView1.EndUpdate()
        End Sub

  20. #20
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Petite piste:

    Dans ton Form1.Load tu as:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Me.ListView1.ColumnClick, AddressOf listView1_ColumnClick
    Normalement, tu n'as pas à l'ajouter. ListView est un control qui est déjà présent dans Visual Studio.

    Donc même si tu mets pas le AddHandler, VS le fera pour toi lorsque tu créeras l'évènement.

    Théorie: L'évènement Form1_Load se déclenche à chaque fois que tu affiches ta fenêtre Form1.

    Donc si ça se trouve tu recréer ta listview plusieurs fois, avec AddHandler plusieurs fois.

    Essaie en mettant cette ligne en commentaire...
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tri par ordre croissant dans des TextBox
    Par neoph dans le forum VB.NET
    Réponses: 6
    Dernier message: 01/12/2012, 18h31
  2. Tri par ordre croissant dans variable tableau
    Par jojo86 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/11/2009, 16h51
  3. Insertion dans un fichier trié par ordre croissant
    Par darkterreur dans le forum Langage
    Réponses: 14
    Dernier message: 20/09/2009, 19h39
  4. Tri par ordre croissant
    Par KinF dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/12/2008, 20h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo