Icomparer & DataGridView [Résolu]

Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
- - Dernière réponse : Moomoon07
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
- 10 nov. 2006 à 16:36
Salut à tous !

Voila que je galère encore et toujours avec mon Icomparer.
J'ai un datagridview qui contient dans sa 2ème colonne des dates (dd/mm/aaaa).
Ceux sont TOUTES des colonnes du type DataGridViewTextBoxColumn.

Je voudrais qu'il s'organise par date croissante.
Pouvez vous m'expliquer comment ?
Apparement avec ce que j'ai fait, il semble s'organiser sur sa première colonne, qui contient des entiers.
(Merci d'avance)

Voila comment j'appelle et défini mon Icomparer :

Mon appel :
 IComparer MonComparer = new Comparer();
 DATA_C_PDV.Sort(MonComparer);

Ma définition :
    public class Comparer : IComparer
    {
        int IComparer.Compare(object x, object y)
        {
            try
            {
                int X = Convert.ToInt32(x);
                int Y = Convert.ToInt32(y);
                return new Comparer().Compare(X, Y);
            }
            catch
            {
                string X = x.ToString();
                string Y = y.ToString();
                return new Comparer().Compare(X, Y);
            }
        }
        int Compare(string x, string y)
        {
            return string.Compare(x, y);
        }
        int Compare(int x, int y)
        {
            if (x == y)
            {
                return 0;
            }
            else if (x < y)
            {
                return -1;
            }
            else if (x > y)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        int Compare(DateTime x, DateTime y)
        {
            if (x.Year > y.Year)
                return 1;
            else if (x.Year == y.Year)
            {
                if (x.Month > y.Month)
                    return 1;
                else if (x.Month == y.Month)
                {
                    if (x.Day > y.Day)
                        return 1;
                    else if (x.Day == y.Day)
                    {
                        try
                        {
                            if (x.Hour > y.Hour)
                                return 1;
                            else if (x.Hour == y.Hour)
                            {
                                if (x.Minute > y.Minute)
                                    return 1;
                                else if (x.Minute == y.Minute)
                                {
                                    if (x.Second > y.Second)
                                        return 1;
                                    else if (x.Second == y.Second)
                                    {
                                        try
                                        {
                                            if (x.Millisecond > y.Millisecond)
                                                return 1;
                                            else if (x.Millisecond == y.Millisecond)
                                                return 0;
                                            else return -1;
                                        }
                                        catch { return 0; }
                                    }
                                    else return -1;
                                }
                                else return -1;
                            }
                            else return -1;
                        }
                        catch { return 0; }
                    }
                    else return -1;
                }
                else return -1;
            }
            else return -1;
        }
    }

MMN
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
3
Merci
10 ans après ...
Je n'arrive toujours pas à faire fonctionner la solution de Bidou, mais en voici une qui marche :

 IComparer MonComparerDataGrid = new ComparerDataGrid();
 MonDataGrid.Sort(MonComparerDataGrid);

 private class ComparerDataGrid : IComparer
        {
            int IComparer.Compare(object x, object y)
            {
                return new ComparerDataGrid().Compare((DataGridViewRow)x, (DataGridViewRow)y);
            }
            int Compare(DataGridViewRow x, DataGridViewRow y)
            {
                DateTime DateA = System.Convert.ToDateTime(x.Cells[1].Value);
                DateTime DateB = System.Convert.ToDateTime(y.Cells[1].Value);
                return DateA.CompareTo(DateB);
            }
        }

Merci à tous.

MMN

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Moomoon07
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
J'avais oublié de mettre ça à jour :
(Cependant ça ne marche pas mieux).
Comment lui spécifier que c'est sur la deuxième colonne que je veux trier ?
            try
            {
                DateTime X = System.Convert.ToDateTime(x);
                DateTime Y = System.Convert.ToDateTime(y);
                return new Comparer().Compare(X, Y);
            }
            catch
            {
                try
                {
                    int X = Convert.ToInt32(x);
                    int Y = Convert.ToInt32(y);
                    return new Comparer().Compare(X, Y);
                }
                catch
                {
                    string X = x.ToString();
                    string Y = y.ToString();
                    return new Comparer().Compare(X, Y);
                }
            }

MMN
Commenter la réponse de Moomoon07
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
0
Merci
deux choses avant tout :

-si tu es en framework 2, utilise plutot IComparer<T> (performances etc...)
-Convert.ToDateTime(string) te permettrait de te faire bien moins chier avec tes comparaisons et ca te prendrais maintenant juste deux lignes au lieu de toute cette tartine de code (et le framework fera tout ca surement plus rapidement)

sinon, ton comparer compare tes rows si je ne me trompe, dans le cas d'un datagridview, donc tu dois effectuer la comparaison sur x.Cell[1] et y.Cell[1] (donc ton x et ton y ne sont pas des string mais des datarow)
Commenter la réponse de leprov
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Euh, c'est une blague???
J'espère que oui (ou alors, avoir mal compris) :

this.dataGridView.Sort(
this.dataGridView.Columns[x],
ListSortDirection.Ascending); // ou descending

L'utilisateur peut également cliquer sur le header pour trier automatiquement...

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
Salut !

> Convert.ToDateTime(string) te permettrait de te faire bien moins chier avec tes comparaisons
> FAUX, parce que avec cette manière, le jour est prioritaire sur le mois, lui même prioritaire sur l'année (jj/mm/aaaa), alors que de ma manière, l'année est prioritaire sur le mois, lui même prioritaire sur le jour. Et un classement chronologique demande ma solution.

> sinon, ton comparer compare tes rows si je ne me trompe, dans le
cas d'un datagridview, donc tu dois effectuer la comparaison sur
x.Cell[1] et y.Cell[1] (donc ton x et ton y ne sont pas des string mais
des datarow)
> Désolé j'ai pas compris. Je sais pas ou tu vois que je spécifie x et y comme des string.

MMN
Commenter la réponse de Moomoon07
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
leprov> non, la méthode Sort s'attend à une interface de type IComparer et non pas IComparer<T>

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
Bidou > Non ca ne marche pas

J'ai un datagridview DATA avec 4 colonnes A,B,C et D.
Les 4 colonnes sont des DataGridViewTextBoxColumn.
A contient des int.ToString()
B des DateTime().ToString().Substring(0,10)

En utilisant ca :
this.dataGridView.Sort(
this.dataGridView.Columns[x],
ListSortDirection.Ascending);
(en remplacent x par ma colonne)

Ca classe comme ca :
01/09/2007
01/12/1900
15/01/1800
15/11/2006

Moi je veux que ca classe comme ca :

15/01/1800

01/12/1900

15/11/2006
01/09/2007

Sachant que c'est la deuxième colonne.

MMN
Commenter la réponse de Moomoon07
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Pourquoi SubString(0, 10) ? Tu ferais mieux d'appeler la méthode ToShortDateString.

Concernant le tris, il me semble que la méthode que j'ai indiquée fonctionne, c'est éventuellement un problème de Culture...

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
0
Merci
(Convert.ToDateTime(stringA) < Convert.ToDateTime(stringB))

Tes dates sont comparés....ben comme des dates quoi....

sinon pour le IComparer, je voulais dire que

public class Comparer : IComparer
{
int IComparer.Compare(object x, object y)
{
DateX = Convert.ToDateTime((MyDataRow)x).Cell[1]);
DateY = Convert.ToDateTime((MyDataRow)y).Cell[1]);
return DateX.CompareTo(DateY);
}
}

3 ligne de code...
Commenter la réponse de leprov
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
J'ai testé cette ligne avec d'autres cultures :

this.dataGridView.Sort(this.dataGridView.Columns[x], ListSortDirection.Ascending);

et ça fonctionne très bien.

Je pense que c'est de loin la meilleures solutution ;-)

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
>

(Convert.ToDateTime(stringA) < Convert.ToDateTime(stringB))
Tes dates sont comparés....ben comme des dates quoi....
> Non, parce qu'il organise par rapport à la 1ere colonne (ColonneA)
Moi je veux lui spécifier que le tri se fait sur la 2ème colonne.
Mon Icomparer s'applique au int de la première colonne.

Qu'est ce que tu met à la place de MyDataRow et du petit x dans ton dernier exemple ? Avec cet exemple : (par exemple )

J'ai un datagridview DATA avec 4 DataGridViewTextBoxColumnA,B,C et D.
A contient des int.ToString()
B des DateTime().ToString().Substring(0,10)

MMN
Commenter la réponse de Moomoon07
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Oublie voir ce SubString(0, 10)! ;-) [ToShortDateString]

Concernant la méthode que j'ai donnée, elle fonctionne tout à fait. En tout cas avec les quelques teste que j'ai fait...

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
0
Merci
1 - LA méthode de Bidou fonctionne tres bien
2 - x et y sont les paramètres.....
3 - MyDataRow cest le type de ta datarow, ou ta datagridviewrow ou que sais je...
Commenter la réponse de leprov
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
    public class Comparer : IComparer
    {
            int IComparer.Compare(object x, object y)
    {
        DateTime DateX = Convert.ToDateTime(((DataGridViewRow)x).Cells[1]);
        DateTime DateY = Convert.ToDateTime(((DataGridViewRow)y).Cells[1]);
        return DateX.CompareTo(DateY);
            }

Ca donne une erreur :

{"Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.DataGridViewTextBoxCell' en type 'System.IConvertible'."}

MMN
Commenter la réponse de Moomoon07
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Tu n'as pas besoin de cette interface, je ne sais pas si tu lis ce que j'écris?

-Blog-
Commenter la réponse de cs_Bidou
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Dernière intervention
5 mai 2014
0
Merci
Je te dis que ca marche pas. Donc j'essaye de faire marcher l'autre solution. Jvais pas bloquer 10 ans sur ta solution. Et oui je lis ce que tu écris, et j'essaye aussi. Et même plus, c'était ma première idée et j'y ai galéré quelques heures dessus.

MMN
Commenter la réponse de Moomoon07
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Mais je pense que ta première idée n'est pas la bonne solution.
Tu ferais mieux de chercher pourquoi ça ne marche pas ce que je te propose et d'avoir une solution propre plutôt que de bricoler quelques chose par dessus...
M'enfin, tu fais comme tu veux!

Plus, je ne peux pas faire...
Bonne chance.

-Blog-
Commenter la réponse de cs_Bidou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.