Tri dans un listView [Résolu]

Signaler
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
-
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
-
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 !

10 réponses

Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
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#
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
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.
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
Merci, ça marche bien
Mais je ne comprend pas comment est utilisé la methode Compare
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
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.
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
Jusque là j'avais compris, ce que je n'ai pas saisi c'est à quel moment la méthode compare est appelée !
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
Merci Coq, j'y vois plus clair.
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
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.
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
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#
Messages postés
27
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
29 novembre 2010

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.
Messages postés
273
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
6 février 2009
1
Salut,




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






<hr />
ZeBobo5