Trier un datgrid sur plusieurs colonnes

Signaler
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
bonjour,
tout d'abord a quel moment se declenche le tri sur une colonne (evenement?) (clique sur le columnheader?).
J'aimerais savoir s'il est possible de trier sur plusierus colonnes d emaniere simple et comment faire.
Par exemple , j'ai plusieurs champs dont  nom et prenom, si je clique sur nom ca me tri tout sur le nom, ensuite si je clique sur prenom ca me trie le tout sur prenom sans prendre en compte le nom. Ce que je voudrais c'est que lorsque je clique sur nom apr'es avoir cliqué sur prenom , j'obtiens la liste triées des noms et pour chaque nom (groupe de meme nom) les elements osnbt triés sur le prenom.

Je sais pas si c tres clair

en tout cas merci pour toute aide...

10 réponses

Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Une piste, essai de mettre la propriété sortMode de ton datagridview a programmatic et défini une classe de tri.

Théo
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
je ne compredns pas bien  "defini une classe de tri".
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Salut,

RMI veut parler d'une classe qui implémente l'interface IComparer. Tu peux créer cette classe de manière à lui faire comparer des objets DataGridRow, et ensuite passer une instance de cette classe à la méthode Sort du DataGridView. Tu as un exemple sur MSDN : http://msdn2.microsoft.com/en-us/library/wstxtkxs.aspx.

<hr size="2" width="100%" />Pour des débats relatifs à la programmation, essayez ce forum.
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
OK merci c bien plus clair avec cet exemple
Je vais tester ca tout de suite...
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
ca a l'air de fonctionner,
par contre si je veux comparer d'autres types (des nombres , des dates) existe-til un moyen génral de faire les comparaison ou faut-il faire system.decimal.compare , etc... et donc il y a un cas particulier pour chaque colonne, on n epeut vraiment generaliser?

d'apres ce que j'ai compris le tri automatic semble etre une sorte de  sort ("selectedcolumn", ascending ou descending)
cependant il a l'air de savoir comment trier , on peut lui mettre n'importe quelle type le tri  est toujours impec. Comment fait-il s'il ne sait le type de la colonne (de meme pour cette dernier methode sort avec la colonne et l'ordre en param)?
pourrait-on faire qque chose du genre avec le sort (icomparer)?
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
En fait, tu peux trier des colonnes de n'importe quel type, pourvu que le type en question implémente l'interface IComparable, ce qui est le cas de tous les types numériques (int, float, etc.) et de certains objets comme les String ou les DateTime.

<hr size="2" width="100%" />Pour des débats relatifs à la programmation, essayez ce forum.
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
oui ca d'accord on peut les trier mais la question est:
faut-il forcement utuliser a chaque fois system.string.compare , system.decimal.compare ou y a t il un moyen de faire une comparaison a l'aide de qque chose de general.
quand on appelle la methode sort(column,lisgtsortdirection) on n'a pas a preciser quel sorte de comparaison on effectue (que ce soit sur le string ou sur la valeur ou je ne sai s pas) , le programme le fait tout seul.
Ce que je voudrais savoir est quel outil de comparaison utilise le automatic sort pour trier sur n'importe quel type comme il le fait (comment il fait pour deviner le type?) et peut on fair ela meme chose avec compare (ne pas avoir a preciser le tyupe de comparaison).
Ma question est ell eplus claire?

Merci
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Il n'est pas nécessaire d'appeler distinctement des méthodes du genre System.String.Compare, System.Decimal.Compare, etc. Il suffit de considérer les objets de la colonne comme des instances de IComparable et d'utiliser la méthode CompareTo de cette interface.

Donc le code de la méthode Compare de IComparer peut ressembler à cela :
<hr size="2" width="100%" />publicint Compare(object x, object y)
{
DataGridViewRow DataGridViewRow1 = (DataGridViewRow)x;
DataGridViewRow DataGridViewRow2 = (DataGridViewRow)y;

// Attention à l'InvalidCastException si la colonne ne contient
// pas un objet implémentant IComparable...
IComparable val1 = (IComparable)DataGridViewRow1.Cells[1].Value;

int compareResult = val1.CompareTo(DataGridViewRow2.Cells[1].Value);

if (compareResult == 0)
{
// Les deux lignes ont la même valeur dans la colonne 2,
// comparer les valeurs des colonnes 4
val1 = (IComparable)DataGridViewRow1.Cells[3].Value;
compareResult = val1.CompareTo(DataGridViewRow2.Cells[3].Value);
}

return val1;
}

<hr size="2" width="100%" />Ici, j'ai limité la comparaison à deux colonnes, mais tu peux facilement étendre cela pour tester autant de colonnes que tu veux...

<hr size="2" width="100%" />Pour des débats relatifs à la programmation, essayez ce forum.
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Oups, la boulette ! Dans le code de la méthode précédente, c'est bien évidemment la valeur de compareResult qu'il faut renvoyer, et non celle de val1...

<hr size="2" width="100%" />Pour des débats relatifs à la programmation, essayez ce forum.
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
merci ca fait bien plus court que ce que j'ai ecrit du coup.