Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDernière intervention 5 mai 2014
-
9 nov. 2006 à 16:38
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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;
}
}
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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);
}
}
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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)
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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.
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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...
Moomoon07
Messages postés223Date d'inscriptionmercredi 31 mai 2006StatutMembreDerniè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.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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!