Tri dans un listView

Résolu
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 - 24 août 2005 à 17:50
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 !

10 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 août 2005 à 00:12
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#
3
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
24 août 2005 à 18:05
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.
0
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
25 août 2005 à 10:30
Merci, ça marche bien
Mais je ne comprend pas comment est utilisé la methode Compare
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
25 août 2005 à 10:47
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.
0

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

Posez votre question
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
25 août 2005 à 11:24
Jusque là j'avais compris, ce que je n'ai pas saisi c'est à quel moment la méthode compare est appelée !
0
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
26 août 2005 à 08:27
Merci Coq, j'y vois plus clair.
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
26 août 2005 à 09:24
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.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 août 2005 à 10:45
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#
0
sidommou Messages postés 27 Date d'inscription vendredi 31 décembre 2004 Statut Membre Dernière intervention 29 novembre 2010
20 déc. 2007 à 00:32
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.
0
zebobo5 Messages postés 273 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 6 février 2009 1
21 déc. 2007 à 09:18
Salut,




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






<hr />
ZeBobo5
0
Rejoignez-nous