Tri dans un listView [Résolu]

Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
- - Dernière réponse : zebobo5
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
- 21 déc. 2007 à 09:18
Salut,
Comment faire pour que le tri dans une listView (Sorting) dépendent de la colonne cliquée ?
En gros si l'utilisateur clique sur la colonne 1, la liste est trié suivant la colonne 1, sur la 2, suivant le contenu de la colonne 2 ...
Peut ai-je raté un truc, mais là je suis perplexe !
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
3
Merci
Salut,

C'est le contrôle ListView qui le fait quand l'utilisateur clique sur les en-têtes de colonne ou lorsque tu appelles la méthode Sort.

Cocoricoooooooo !!!!
coq
MVP Visual C#

Dire « Merci » 3

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

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

Commenter la réponse de cs_coq
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
Tu crée une classe de comparaison de données :



class
ListViewItemComparer :
IComparer
{

private
int col;

private
SortOrder order;

public ListViewItemComparer()
{
col = 0;
order =
SortOrder .Ascending;
}

public ListViewItemComparer(
int column,
SortOrder order)
{
col = column;

this.order = order;
}

public
int Compare(
object x,
object y)
{

int returnVal= -1;
returnVal =
String .Compare(((
ListViewItem)x).SubItems[col].Text,
((
ListViewItem)y).SubItems[col].Text);

if (order ==
SortOrder .Descending)
returnVal * = -1;

return returnVal;
}
}

Puis tu n'as plus qu'à faire un tri losque l'on clique sur l'entete de la colonne, d'où :


private
void listView1_ColumnClick(
object sender,
ColumnClickEventArgs e)
{

if (listView1.Sorting = =
SortOrder .Ascending)
{
listView1.Sorting =
SortOrder.Descending;
}

else
{
listView1.Sorting =
SortOrder .Ascending;
}
listView1.Sort();

this.listView1.ListViewItemSorter =
new
ListViewItemComparer(e.Column, listView1.Sorting);
}

Et voilà


<HR>
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
0
Merci
Merci, ça marche bien
Mais je ne comprend pas comment est utilisé la methode Compare
Commenter la réponse de t_barbillon
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
int i = String .Compare("a", "b");
Resultat : i = -1;

int i = String .Compare("b", "a");
Resultat : i = 1;

dc si on met en ordre décroissant, i doit être du signe opposé soit : i *= -1;

dc si i = -1 alors 1er paramètre est avant le 2eme
et si i = 1 alors 1er paramètre est apres le 2eme


<HR>
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
0
Merci
Jusque là j'avais compris, ce que je n'ai pas saisi c'est à quel moment la méthode compare est appelée !
Commenter la réponse de t_barbillon
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
0
Merci
Merci Coq, j'y vois plus clair.
Commenter la réponse de t_barbillon
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
Salut,

Moi j'aurai plutot penché sur le fait que lorsque tu fait :

this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column, listView1.Sorting);

La listView instancie la class et substitue sa méthode : this.listView1.ListViewItemSorter.Compare, par la nouvelle méthode Compare de la class ListViewItemComparer.

C'est vrai que lorsque tu fait un Sort(), il repasse dedans vu qu'on lui a assigné une nouvelle méthode de comparaison.


<HR>
ZeBobo5
N'oubliez pas de cloturer votre post.
Commenter la réponse de zebobo5
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
0
Merci
En tout cas l'affectation de valeur sur cette propriété entraine elle aussi l'appel de la méthode Sort.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
27
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
29 novembre 2010
0
Merci
Salut,
j'ai procédé comme vous l'avez di mais j'ai eu un pb avec .net2005. Il me sort une erreur sur la ligne suivante:

CDContent_ListView.ListViewItemSorter =

new
ListViewItemComparer
(((
ListViewItem
)(e.Column)), CDContent_ListView.Sorting);

L'erreur est :
Impossible de convertir le type 'int' en 'System.Windows.Forms.ListViewItem'

Si qlq un connais la solution à mon problème, merci d'avance de répondre.
Commenter la réponse de sidommou
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
0
Merci
Salut,




e.Column te renvoi un Int or tu veux le caster en ListViewItem...






<hr />
ZeBobo5
Commenter la réponse de zebobo5