Icomparer & DataGridView [Résolu]

Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 16:38 - Dernière réponse : Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention
- 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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 10 nov. 2006 à 16:36
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

Merci Moomoon07 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de Moomoon07
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 16:43
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
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 9 nov. 2006 à 18:31
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 18:43
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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 18:43
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 18:49
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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 18:51
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 18:57
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
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 9 nov. 2006 à 19:07
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 19:23
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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 19:26
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 19:38
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
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 9 nov. 2006 à 19:47
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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 20:09
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 9 nov. 2006 à 20:40
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
Moomoon07 223 Messages postés mercredi 31 mai 2006Date d'inscription 5 mai 2014 Dernière intervention - 9 nov. 2006 à 22:16
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 10 nov. 2006 à 07:34
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.