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 :

[débutant]Problème de tri sur ListView : IComparer


Sujet :

Windows Forms

  1. #1
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Points : 5 848
    Points
    5 848
    Par défaut [débutant]Problème de tri sur ListView : IComparer
    Bonjour,

    En suivant la procédure présente dans la FAQ permettant de trier un ListView j'ai quelques problèmes :

    J'ai copié la classe "ListViewItemComparer : Icomparer" dans un fichier .cs portant le même nom.
    Sur ce fichier j'ai rajouté l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Windows.Forms;
    afin que les références à "SortOrder" soient acceptées. J'ai également rajouté la mention "public" devant ma classe.

    J'ai copié l'évènement et l'instanciation de classe "ListView1_ColumnClick()" dans un autre .cs : frmLauncherBo correspondant à un formulaire. J'ai renommé toutes les occurences de "ListView1" par le nom de mon listview : "test" (pas très original je sais)

    Lorsque je compile, j'obtiens deux erreurs :
    - L'utilisation du type 'System.Collections.Generic.IComparer<T>' générique requiert les arguments de type '1' (Avec focus sur la mention IComparer)
    - Le type ou le nom d'espace de noms 'ListViewItemComparer' est introuvable (une directive using ou une référence d'assembly est-elle manquante*?) (Avec focus sur la mention ListViewItemComparer)

    Etant débutant en C#, j'avoue un peu pédaler dans la semoule... Donc si quelqu'un avait une idée je lui en serais très reconnaissant.

    Merci d'avance

    PS: J'ai oublié de préciser que la version de mon Framework est la 2.0, pour laquelle IComparer, a priori, est accepté.
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Alors,

    L'utilisation du type 'System.Collections.Generic.IComparer<T>' générique requiert les arguments de type '1'.
    Après pour en connaître la raison, ça nous aiderait de voir l'utilisation que tu en fais justement et de voir le code.

    Le type ou le nom d'espace de noms 'ListViewItemComparer' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
    Il manque un using. Ton fichier dans lequel est ListViewItemComparer et celui dans lequel tu l'utilises ne sont pas dans le même namespace ? Impossible de le dire sans voir le code.

  3. #3
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Points : 5 848
    Points
    5 848
    Par défaut
    ça nous aiderait de voir l'utilisation que tu en fais justement et de voir le code.
    Mais bien sûr monseigneur, le voici : (fichier ListViewItemComparer.cs)
    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
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
     
    namespace BOApp.Types
    {
        public class ListViewItemComparer : IComparer
        {
            private int col;
            private SortOrder sortOrder;
            public ListViewItemComparer()
            {
                col = 0;
                sortOrder = Windows.Forms.SortOrder.Ascending;
            }
            public ListViewItemComparer(int column)
            {
                col = column;
                sortOrder = Windows.Forms.SortOrder.Ascending;
            }
            public ListViewItemComparer(int column, SortOrder s)
            {
                col = column;
                sortOrder = s;
            }
            public int Compare(object x, object y)
            {
                if (sortOrder == Windows.Forms.SortOrder.Ascending)
                { return string.Compare(((ListViewItem)(x)).SubItems(col).Text, ((ListViewItem)(y)).SubItems(col).Text); }
                else
                { return string.Compare(((ListViewItem)(y)).SubItems(col).Text, ((ListViewItem)(x)).SubItems(col).Text); }
            }
        }
     
    }
    Ton fichier dans lequel est ListViewItemComparer et celui dans lequel tu l'utilises ne sont pas dans le même namespace ? Impossible de le dire sans voir le code
    Effectivement, ils ne sont pas dans le même namespace : "BOApp" vs "BOApp.Types" mais il y a le using correspondant dans le fichier. (fichier frmLauncherBo.cs)

    Alors je ne vais pas mettre tout le code, j'espère que ça suffira :
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration;
    using System.Data;
    using Oracle.DataAccess.Client;
    using System.Diagnostics;
    using System.Drawing;
    using System.Globalization;
    using System.Text;
    using System.Threading;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    using System.IO;
    using BOApp.Types;
    using Microsoft.Office.Interop.Excel;
    using BOApp;
     
    namespace BOApp
    {
        public partial class frmLauncherBo : Form
        {
    (...)
            private void test_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
            {
                if (this.test.Sorting == SortOrder.Ascending)
                { this.test.Sorting = SortOrder.Descending; }
                else
                { this.test.Sorting = SortOrder.Ascending; }
                this.test.ListViewItemSorter = new ListViewItemComparer(e.Column, this.test.Sorting);
            }
    }
    Voilà, sachant que mon ListView "test" est déclaré dans "frmLauncherBo.Designer.cs" et qu'il apparait bien via la saisie intuitive dans le fichier "frmLauncherBo" (au même titre que "ListViewItemComparer" d'ailleurs)
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    En fait, tu avais le using System.Collections.Generic qui propose une interface IComparer<T>. L'interface IComparer elle, est dans System.Collections. Il faut donc remplacer System.Collections.Generic par System.Collections. Ensuite, il y avait un problème au niveau de SubItems qui retourne un tableau et doit donc être utilisé avec [] et non pas (). Maintenant, le code devrait fonctionner.

    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
     
     
    using System;
    using System.Collections;
    using System.Windows.Forms;
     
    namespace BOApp.Types
    {
     
    public class ListViewItemComparer : IComparer {
     
            private int col;
            private SortOrder sortOrder;
     
            public ListViewItemComparer() {
                col = 0;
                sortOrder = SortOrder.Ascending;
            }
     
            public ListViewItemComparer(int column) {
                col = column;
                sortOrder = SortOrder.Ascending;
            }
     
            public ListViewItemComparer(int column, SortOrder s) {
                col = column;
                sortOrder = s;
            }
     
            public int Compare(object x, object y) {
                if (sortOrder == SortOrder.Ascending) { 
                    return string.Compare(((ListViewItem)(x)).SubItems[col].Text, ((ListViewItem)(y)).SubItems[col].Text); 
                } else { 
                    return string.Compare(((ListViewItem)(y)).SubItems[col].Text, ((ListViewItem)(x)).SubItems[col].Text); 
                }
            }
     
    }
     
    }
    Je suppose que l'autre erreur venait du fait que le code ne compilait pas.

  5. #5
    Rédacteur
    Avatar de TomDuBouchon
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2009
    Messages
    3 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 343
    Points : 5 848
    Points
    5 848
    Par défaut
    Ca fonctionne nickel...

    Un GRAND MERCI Kaidan !!!

    Du coup, il faudrait voir à changer le problème du tableau au niveau de SubItems dans la FAQ pour éviter que quelqu'un d'autre revienne poser la même question...
    Pensez à consulter les FAQs BI, les Tutoriels BI et à effectuer des Recherches.
    Un message vous a aidé ? Votez en cliquant sur
    Votre problème est résolu ? Merci de l'indiquer en cliquant sur le bouton

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    A mon avis, une traduction rapide et effectivement incorrecte d'un code VB.NET.

    Le principal problème était tout de même l'utilisation de System.Collections au lieu de System.Collections.Generic.

    Comme quoi, poster son code, ça aide.

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

Discussions similaires

  1. [débutant] problème d'image sur une form
    Par Anthony17 dans le forum Delphi
    Réponses: 3
    Dernier message: 21/11/2006, 14h49
  2. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  3. Problème de tri sur les dates par année puis mois
    Par rob2-9 dans le forum Access
    Réponses: 26
    Dernier message: 11/08/2006, 11h04
  4. [VB.NET] Problème de tri sur Datagrid/gridview multilingue
    Par crimsonPhantom dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/03/2006, 22h41
  5. Tri sur Listview
    Par Chacks dans le forum Composants VCL
    Réponses: 2
    Dernier message: 17/02/2006, 14h26

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