Icomparer & DataGridView

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

17 réponses

Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
10 nov. 2006 à 16:36
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
3
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 16:43
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
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
9 nov. 2006 à 18:31
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)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 18:43
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-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 18:43
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 18:49
leprov> non, la méthode Sort s'attend à une interface de type IComparer et non pas IComparer<T>

-Blog-
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 18:51
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 18:57
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-
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
9 nov. 2006 à 19:07
(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...
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 19:23
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-
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 19:26
>

(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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 19:38
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-
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
9 nov. 2006 à 19:47
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...
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 20:09
    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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 nov. 2006 à 20:40
Tu n'as pas besoin de cette interface, je ne sais pas si tu lis ce que j'écris?

-Blog-
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
9 nov. 2006 à 22:16
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
10 nov. 2006 à 07:34
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-
0
Rejoignez-nous