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 :

Tri des colonnes non liées d'un datagridview


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Tri des colonnes non liées d'un datagridview
    Bonjour,

    Voici ce que j'essaie de faire.

    J'ai un datagridview dans un winform et je crée moi même les colonnes dans le code (entre autre parce que j'ai une colonne rempli par des datetimepicker lorsque la colonne est une date. Je rempli ensuite le datagridview avec un SQLDataReader qui parcours la table qui contient les informations que je veux afficher.

    Jusque là tout fonctionne. Le problème c'est que je suis incapable de faire en sorte que l'utilisateur puisse trier le datagridview en cliquant sur le header d'une colonne.

    Je configure le DataGridViewColumnSortMode de chaque colonne à programmaticly. J'ai implémenté la classe suivante trouver sur internet :

    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
     
    private class RowComparer : System.Collections.IComparer
        {
            private static int sortOrderModifier = 1;
            private static int colNumber=0;
     
            public RowComparer(SortOrder sortOrder,int col)
            {
                colNumber=col;
                if (sortOrder == SortOrder.Descending)
                {
                    sortOrderModifier = -1;
                }
                else if (sortOrder == SortOrder.Ascending)
                {
                    sortOrderModifier = 1;
                }
            }
     
            public int Compare(object x, object y)
            {
                DataGridViewRow DataGridViewRow1 = (DataGridViewRow)x;
                DataGridViewRow DataGridViewRow2 = (DataGridViewRow)y;
     
                // Try to sort based on the Last Name column.
                int CompareResult = System.String.Compare(
                    DataGridViewRow1.Cells[colNumber].Value.ToString(),
                    DataGridViewRow2.Cells[colNumber].Value.ToString());
     
                           return CompareResult * sortOrderModifier;
            }
        }
    J'appelle le code suivant dans l'événement de clique sur l'entête d'une colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataGridView1.Sort( new RowComparer( SortOrder.Ascending.e.ColumnIndex ) );
    Le problème c'est que ça ne fonctionne pas... quand je clique sur l'entête de la colonne (en debuggant) je vois que le constructeur de RowComparer est appeller mais la methode Compare ne l'est jamais. Est-ce que quelqu'un pourrait me pointer mon erreur ou me suggérai une meilleur façon de procéder?

    Merci

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Je suggérerai d'utiliser une DataTable liée au DatagridView via un bindingSource.

    Ainsi, on peut trier (filtrer) facilement en utilisant la propriété Sort (Filter) du BindingSource qui lie la DataTable au DataGridView.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Effectivement si je fais ça je peux facilement trier.
    Le problème c'est que dans ma table, il y a des champs de type date. Si je passe par un bindingsource, elles seront affichées dans une colonne texte.

    En créant moi même les colonnes, j'ai pu faire une colonne qui contient un champs datetimepicker plutot que textbox, ce qui rend le tout plus conviviale pour l'utilisateur qui voudra modifier une date... mais dans ce cas je suis incapable de tier... pour une raison que je ne comprend pas, la methode Compare de ma classe RowComparer n'est jamais appellée.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si je passe par un bindingsource, elles seront affichées dans une colonne texte.
    C'est le ToString() de la date qui est affiché, mais les colonnes resteront de type Date.

    Un avis:
    Eviter d'utiliser le dataGridView pour entrer des données : c'est bien des ennuis en perspective, dès qu'on veut intègrer un minimum de logique métier.
    La solution : utiliser le DGV en Read-Only et créer les fonctions d'ajout, modif, suppression de lignes.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    J'ai trouvé une solution qui fonctionne.
    Il faut mettre le datagridview.autogeneratecolumn à false, créer les colonnes manuellement et ensuite assigne le DataPropertyName de la colonne au champs de la table detourner par la requete SQL.

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

Discussions similaires

  1. requete sur des tables non liées
    Par matesp dans le forum Access
    Réponses: 3
    Dernier message: 03/05/2006, 17h01
  2. Tri des colonnes au choix
    Par nora_ora dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2005, 17h11
  3. Réponses: 1
    Dernier message: 28/09/2005, 18h10
  4. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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