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

Windows Forms Discussion :

Problème de ListView Comparer


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut Problème de ListView Comparer
    Coucou les gens.

    Un problème se pose de nouveau sur mon histoire de listview (si ça continue je vais connaître le contrôle par coeur).

    Aujourd'hui, le problème c'est au niveau du tri.

    Comme expliqué sur le msdn j'ai copié/collé un bout de code qui permet le tri de mes colonnes https://msdn.microsoft.com/en-us/library/ms996467.aspx

    Le truc c'est que ça compare QUE en string. Du coup, comme certaines de mes colonnes contiennent du float, j'ai modifié le tri par date proposé en fin d'article par cette chose :

    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
        public int Compare(object x, object y)
        {
            int returnVal = -1;
            try
            {
                float firstnumber = float.Parse(((ListViewItem)x).SubItems[col].Text);
                float secondnumber = float.Parse(((ListViewItem)y).SubItems[col].Text);
     
                if (firstnumber > secondnumber) returnVal = 1;
                else if (firstnumber < secondnumber) returnVal = -1;
                else returnVal = 0;
            }
            catch
            {
                returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
                            ((ListViewItem)y).SubItems[col].Text);
            }
            // Determine whether the sort order is descending.
            if (order == SortOrder.Descending)
                // Invert the value returned by String.Compare.
                returnVal *= -1;
     
            return returnVal;
        }
    Cependant lorsque je tri autre chose que du float; ça met un temps HORRIBLEMENT GRAND (et encore il n'y a qu'une trentaine de listviewitem à trier).

    Donc la question est :
    - Est-il possible de détecter et retyper le contenue sans passer par le try/catch, pour optimiser le tri de manière plus générale (datetime, int, float, ...) ?

    Merci d'avance de vos réponses

  2. #2
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut
    Solution trouvée !

    C'est pas vraiment "LA" solution par définition, mais ça corrige le problème.

    Sur chacune de mes colonnes, j'attribue dans le tag un string qui définie le type betement ("string" si c'est un string, "float" si c'est un float, ainsi de suite)

    Je modifie le constructeur de ListViewItemComparer en ajoutant le paramètre string type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private string type;
            public ListViewItemComparer() {
                col=0;
                type = "string";
                order = SortOrder.Ascending;
            }
            public ListViewItemComparer(int column, SortOrder order, string type) 
            {
                col=column;
                this.order = order;
                this.type = type;
            }
    Pour récupérer le type, je modifie la déclaration du ListVewItemComparer dans mon event ColumnClick :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column,
                                                                  listView1.Sorting, 
                                                                  (string)listView1.Columns[e.Column].Tag);
    Puis j'ai plus qu'à modifier la méthode Compare comme ceci :

    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
            public int Compare(object x, object y)
            {
                int returnVal = -1;
                if (type == "float")
                {
                    float firstnumber = float.Parse(((ListViewItem)x).SubItems[col].Text);
                    float secondnumber = float.Parse(((ListViewItem)y).SubItems[col].Text);
     
                    if (firstnumber > secondnumber) returnVal = 1;
                    else if (firstnumber < secondnumber) returnVal = -1;
                    else returnVal = 0;
                }
                else
                {
                    returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
                                ((ListViewItem)y).SubItems[col].Text);
                }
                // Determine whether the sort order is descending.
                if (order == SortOrder.Descending)
                    // Invert the value returned by String.Compare.
                    returnVal *= -1;
     
                return returnVal;
            }
    Et voilà le travail ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#]Problème de listview
    Par Fredo02 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 16/06/2007, 15h00
  2. Problème avec listview
    Par Svenna dans le forum Général VBA
    Réponses: 9
    Dernier message: 27/01/2007, 16h55
  3. Problème affichage ListView
    Par sorcer1 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/01/2007, 14h52
  4. [nested:equal]problème avec valeur à comparer
    Par david06600 dans le forum Struts 1
    Réponses: 7
    Dernier message: 27/11/2006, 17h47
  5. [C#] Problème avec ListView
    Par yannick dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/06/2004, 17h29

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