Bonjour
Je voudrais trier une Listview1 par ordre alphabétique de la 2eme colonne
comment m'y prendre.?
les tutos que j'ai trouvé expliquent à partir d'un click sur la colonne mais comment le faire par programmation sans click dessus?
Version imprimable
Bonjour
Je voudrais trier une Listview1 par ordre alphabétique de la 2eme colonne
comment m'y prendre.?
les tutos que j'ai trouvé expliquent à partir d'un click sur la colonne mais comment le faire par programmation sans click dessus?
Quelle techno ? Windows Forms, WPF, Silverlight, ASP.NET ?
Je vais supposer qu'il s'agit de Windows Forms...
Il faut implémenter un comparateur (une classe qui implémente l'interface IComparer) pour comparer les ListViewItems. En voilà un réutilisable qui permet de spécifier la colonne selon laquelle trier :
Ca s'utilise comme ça :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Class ListViewItemComparer Implements IComparer Private ReadOnly _columnIndex As Integer Public Sub New(columnIndex As Integer) _columnIndex = columnIndex End Sub Public Function Compare(x As Object, y As Object) As Integer Dim itemX As ListViewItem = DirectCast(x, ListViewItem) Dim itemY As ListViewItem = DirectCast(y, ListViewItem) Dim subItemX As ListViewItem.ListViewSubItem = itemX.SubItems(_columnIndex) Dim subItemY As ListViewItem.ListViewSubItem = itemY.SubItems(_columnIndex) Dim textX As String = subItemX.Text Dim textY As String = subItemY.Text Return String.Compare(textX, textY, True) End Function End Class
Pour trier selon la colonne cliquée, tu peux gérer l'évènement ColumnClick :Code:listView1.ListViewItemSorter = New ListViewItemComparer(1)
EDIT: après avoir écrit ça je réalise que c'est presque exactement l'exemple qui est dans la doc... j'aurais mieux fait de faire un copier/coller :aie:Code:
1
2
3 Private Sub lv_ColumnClick(sender As Object, e As ColumnClickEventArgs) listView1.ListViewItemSorter = New ListViewItemComparer(e.Column) End Sub
merci tomlev pour votre reponse ?
je suis sous vb.net express 2008
en fait j'avais plus ou moins trouvé un code equivalant
mais mon problème est pour l'adapter à une routine qui ne passe pas par un click sur la colonne
je veux trier à partir d'une sub qui tri la listview par la colonne 2
mon niveau débutant autodidacte ne me permet pas d'adapter le code :cry:
mais je progresse ( il est dur de reculer à ce stade :roll:)
un petit coup de pouce svp :D
Bah c'est pas plus difficile, je t'ai déjà donné le code pour le faire :
(la 2e colonne est celle qui a l'index 1, puisque les index commencent à 0)Code:listView1.ListViewItemSorter = New ListViewItemComparer(1)
re
il est vrai que j'avais zapé la bonne réponse :oops:
mais j'ai encore un petit problème
j'ai mis le code
en debut du code de ma Form1vbCode:
1
2
3
4 Class ListViewItemComparer Implements IComparer .... End Class
et j'ai une erreur sur:
Implements ICompareroù faut il donc placer le code de la class ListViewItemComparerCitation:
Class'ListViewComparer'doit implémenter 'Function Compare(x As Object,y As Object)As Integer' pour l'interface'System.Collection.IComparer'.
( c'est la première fois que je dois rajouter une class à mon code ! :?)
Merci pour toutes ces infos
Je viens de trouver le problème :yaisse3:
j'ai rajouté : Implements IComparer.Compare
et tout rentre dans l'ordreCode:Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
encore merci pour ton aide :D
Ah ok... j'avais écrit le code en C# et je l'avais passé dans un convertisseur automatique pour traduire en VB, mais ce convertisseur est loin d'être parfait :aie:. Je pensais pas que la clause Implements devait être spécifiée explicitement... en C# ce n'est pas nécessaire.