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 :

Trier un listview


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut Trier un listview
    Bonjour,

    j'utilise un bout de code récuperé sur FAQ pour trier les columns de mon listview, le code est fonctionnel dans le sens ou il n'y a pas d'erreur. Mon problème c'est que ma column contiens des nombres et les négatif reste confondu dans la liste.

    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
    Public Class ListViewItemComparer
        Implements IComparer
        Private col As Integer
        Private sortOrder As SortOrder
     
        Public Sub New()
            col = 0
            sortOrder = Windows.Forms.SortOrder.Ascending
        End Sub
     
        Public Sub New(ByVal column As Integer)
            col = column
            sortOrder = Windows.Forms.SortOrder.Ascending
        End Sub
     
        Public Sub New(ByVal column As Integer, ByVal s As SortOrder)
            col = column
            sortOrder = s
        End Sub
     
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
            If sortOrder = Windows.Forms.SortOrder.Ascending Then
                Return String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
            Else
                Return String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)
            End If
     
        End Function
    End Class
    l'ajustement à faire se situe surment au niveau de la function Compare mais j'aurais besoin d'aide pour l'exercice.

    merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    les négatif reste confondu dans la liste.
    C'est à dire ?

    A mon avis le problème c'est que tu compares le texte des ListViewItems, ça fait donc une comparaison alphabétique, avec "100" qui est inférieur à "20"
    Il faut convertir en nombre le texte de tes ListViewItems si tu veux une comparaison numérique.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    dans ma columns 2.50,-2.25,2.20
    au lieu de 2.50,2.20,-2.25



    Edit
    Pourtant je fait des test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim A As String = "-1"
            Dim B As String = "1"
            MessageBox.Show(String.Compare(A, B).ToString)
    et ça fonctionne

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre.. tu es sûr que ta méthode Compare est bien appelée ? comment as-tu "branché" la classe ListViewItemComparer sur le ListView ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    j'ai essayé plusieurs variante mais toujour le même résultatmais selon l'exemple j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ListVScan_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListVScan.ColumnClick
            If Me.ListVScan.Sorting = SortOrder.Ascending Then
                Me.ListVScan.Sorting = SortOrder.Descending
            Else
                Me.ListVScan.Sorting = SortOrder.Ascending
            End If
            Me.ListVScan.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListVScan.Sorting)
     
        End Sub

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    Je viens de voir que sur le FAQ l'auteur dit ceci
    Remarque : J'effectue ici une comparaison de chaines, il faudra implémenter différement si on compare des nombres par exemple.
    et je ne sait pas quoi faire

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Mario Rousson Voir le message
    j'ai essayé plusieurs variante mais toujour le même résultat
    OK, mais as-tu vérifié que ta méthode Compare est bien appelée ? Mets un breakpoint dedans pour voir

    Citation Envoyé par Mario Rousson Voir le message
    Je viens de voir que sur le FAQ l'auteur dit ceci et je ne sait pas quoi faire
    Bah oui c'est ce que je t'avais dit... Il faut convertir le texte des ListViewItems en nombre (avec Int.Parse ou Double.Parse par exemple)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    oui c'est ce que je croix aussi que c'est un problème alphabétique au lieu de numérique, de la je fais comment pour changer la façon de trier.

    j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return String.Compare(Double.Parse(CType(x, ListViewItem).SubItems(col).Text), Double.Parse(CType(y, ListViewItem).SubItems(col).Text))
    et c'est une erreur

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    histoire de trouver l'erreur j'ai essayé de modifier la chaine récupéré en decimal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Dbl1 As Decimal = (CType(x, ListViewItem).SubItems(col).Text)
    et j'obtiens le message suivant
    L'exception System.InvalidCastException n'a pas été gérée
    Message=La conversion de la chaîne "-9.09 %" en type 'Decimal' n'est pas valide.
    Source=Microsoft.VisualBasic
    StackTrace:
    à Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(String Value, NumberFormatInfo NumberFormat)
    à Microsoft.VisualBasic.CompilerServices.Conversions.ToDecimal(String Value)
    à BourseV3.ListViewItemComparer.Compare(Object x, Object y) dans C:\Users\Mario\documents\visual studio 2010\Projects\BourseV3\BourseV3\ListViewItemComparer.vb:ligne 23
    à System.Windows.Forms.ListView.CompareFunc(IntPtr lparam1, IntPtr lparam2, IntPtr lparamSort)
    à System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
    à System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
    à System.Windows.Forms.Control.DefWndProc(Message& m)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ListView.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 Msg, IntPtr wParam, ListViewCompareCallback pfnCompare)
    à System.Windows.Forms.ListView.Sort()
    à System.Windows.Forms.ListView.set_ListViewItemSorter(IComparer value)
    à BourseV3.ScanMarche.ListVScan_ColumnClick(Object sender, ColumnClickEventArgs e) dans C:\Users\Mario\Documents\Visual Studio 2010\Projects\BourseV3\BourseV3\ScanMarche.vb:ligne 541
    à System.Windows.Forms.ListView.OnColumnClick(ColumnClickEventArgs e)
    à System.Windows.Forms.ListView.WmNotify(Message& m)
    à System.Windows.Forms.ListView.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    à BourseV3.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
    à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()
    InnerException:

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bah tu vois bien ce qui va pas, non ? Y a un signe "%" dans ta chaine, c'est pas un nombre valide... Enlève le signe "%" avant de convertir.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    oui je sais et j'ai modifier le tout en dbl et ça fonctionne pas plus

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    vois le résultat que j'obtiens dans ce petit bout de code test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim A As String = "12.45"
            Dim B As String = "1.25"
            Console.WriteLine("A={0},B={1} SC= {2}", A, B, String.Compare(A, B))
    A=-12.45,B=1.25 SC= 1
    A=12.45,B=1.25 SC= 1
    Dans le premier exemple -12.45 est plus petit que 1.25 et le String.compare retourne 1, dans l'autre 12.45 est plus grand que 1.25 et le S.c. retourn encore 1 ...bizarre non

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bah tu continues à comparer des chaines, je vois pas pourquoi tu t'attends à un résultat différent...

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    ok alors si je veux comparer des nombres String.compare n'est pas approprié?

    Si oui comment faire alors ??

    ok je crois que je comprend, si je veux pouvoir utiliser la function compare autant pour les nombres que pour les lettre je dois inclure dans ma function
    un trypaste pour tester quel genre de donner je dois comparer ensuite c'est un jeu d'enfant de comparer deux double.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Mario Rousson Voir le message
    ok alors si je veux comparer des nombres String.compare n'est pas approprié?
    Bah comme son nom l'indique, String.Compare sert à comparer des chaines, pas des nombres...

    Citation Envoyé par Mario Rousson Voir le message
    Si oui comment faire alors ??
    Je te l'ai déjà dit : tu convertis les chaines en nombres, et tu compares les nombres. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
            Dim dx As Decimal = Decimal.Parse(CType(x, ListViewItem).SubItems(col).Text);
            Dim dy As Decimal = Decimal.Parse(CType(y, ListViewItem).SubItems(col).Text);
            If sortOrder = Windows.Forms.SortOrder.Ascending Then
                Return dx.CompareTo(dy)
            Else
                Return dy.CompareTo(dx)
            End If
     
        End Function
    (en modifiant éventuellement un peu la façon de convertir selon ce qu'il y a dans tes textes)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    cool merci je travail la dessus

    désolé je croyais que je pouvais utiliser String.compare ...je comprend tout maintenant merci

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    bon, ça fonctionne bien quand je met tout en double mais ça accroche si j'essai en decimal

    La variable suivante ne passe pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dx As Decimal = Decimal.Parse(CType(x, ListViewItem).SubItems(col).Text)
    et j'ai aussi essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dx As Decimal = CType(x, ListViewItem).SubItems(col).Text
    mais quand je transforme tout mon code en double
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Dx As Double = CType(x, ListViewItem).SubItems(col).Text
    ça fonctionne bien.

    merci TomLev j'ai avancé ...je travail la dessus

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Mario Rousson Voir le message
    La variable suivante ne passe pas
    Ca veut dire quoi "ne passe pas" ? Si on joue aux devinettes, ça peut durer longtemps...
    Il y a une erreur ? Quelle erreur ?

    En tous cas si c'est un problème de format, je ne vois pas pourquoi ça marcherait mieux en double...

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    pour incrire un decimal dans mon listeview je fait comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LVI.SubItems.Add(CDbl(MaStr(10)).ToString("P"))
    est-ce correct?

    le problème c'est avec le signe %

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Mario Rousson Voir le message
    pour incrire un decimal dans mon listeview je fait comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LVI.SubItems.Add(CDbl(MaStr(10)).ToString("P"))
    est-ce correct?
    Y a aucun Decimal là dedans... tu prends une chaine, tu la convertis en Double, et tu la reconvertis en chaine avec le format "pourcentage". Comme je l'ai dit plus haut, pour reconvertir la chaine en double ou en décimal, enlève le signe "%" de la chaine.

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

Discussions similaires

  1. Trier un listview sur champ date
    Par codial dans le forum IHM
    Réponses: 6
    Dernier message: 08/12/2009, 17h03
  2. Trier un listview par les headercolumn.
    Par gezy369 dans le forum VB.NET
    Réponses: 12
    Dernier message: 11/05/2007, 20h05
  3. Réponses: 7
    Dernier message: 28/01/2007, 11h38
  4. Trier un ListView
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 18/01/2006, 19h50
  5. Trier un ListView
    Par Raylemon dans le forum Composants VCL
    Réponses: 5
    Dernier message: 26/10/2005, 17h31

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