Problème de tri dans un listview

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 - 9 janv. 2007 à 13:13
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009 - 9 janv. 2007 à 13:45
Salut,
             Voila mon problème, je voudrais trier ma listview en fonction de la colonne cliquée. J'ai donc voulu utiliser :  Browsers(TabControl1.SelectedIndex).Sorting SortOrder.Ascending mais le souci c'est qu'elle ne trie que la première colonne j'ai donc envisager de permuter la colonne cliquée avec la première colonne puis de faire Browsers(TabControl1.SelectedIndex).Sorting SortOrder.Ascending et enfin de permuter de nouveau ces deux colonnes afin qu'elle retrouve leurs places d'origine.

            Ma Listview est contient 7 colonnes : Nom, Prénom, Bac, NoteSH, NoteGE, NotePP et Moyenne. Dans les 3° premières colonnes qui ne contiennent que des caractères, ca fonctionne parfaitement. Mais pour les autres colonnes qui contiennent des notes( convertie en texte avec .ToString() avant d'être ajouté au listview), ca ne fonctionne pas.

          Alors est ce que quelqu'un saurait comment régler ce problème : Voici le code :

 Sub PermuterListView(ByVal lv As ListView, ByVal Index As Integer)
        Dim t As String
        For i As Integer = 0 To lv.Items.Count - 1
            With lv.Items(i)
                t = .SubItems(0).Text
                .SubItems(0).Text = .SubItems(Index).Text
                .SubItems(Index).Text = t
            End With
        Next
        For i As Integer = 0 To Browsers(TabControl1.SelectedIndex).Items.Count
            If i = Index Then
                If Browsers(TabControl1.SelectedIndex).Columns(Index).Tag <> "A" Then
                    Browsers(TabControl1.SelectedIndex).Sorting = SortOrder.Ascending
                    Browsers(TabControl1.SelectedIndex).Columns(Index).Tag = "A"
                Else
                    Browsers(TabControl1.SelectedIndex).Sorting = SortOrder.Descending
                    Browsers(TabControl1.SelectedIndex).Columns(Index).Tag = "D"
                End If
            Else
                Browsers(TabControl1.SelectedIndex).Sorting = SortOrder.None
            End If
        Next
        For i As Integer = 0 To lv.Items.Count - 1
            With lv.Items(i)
                t = .SubItems(0).Text
                .SubItems(0).Text = .SubItems(Index).Text
                .SubItems(Index).Text = t
            End With
        Next
    End Sub, ----
(Coloration syntaxique automatique par Kenji)

    Voilà, alors si quelqu'un comprends pourquoi il ne veut bien trier les colonnes contenant le nom, le prénom et le bac de l'étudiant et ne veut pas trier les colonnes contenant les notes qui sont converties avec .ToString() avant d'être ajouter dans la listview

Merci

5 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
9 janv. 2007 à 13:38
Lol, "j'ai donc envisagé" tu retappele code que je t'ai pondu avant-hier :p. Et je t'avais déjà averti de ce problème et donné un moyen de le résoudre :
Tu ne dois pas utiliser .ToString pour transformer tes nombres en chaines, mais Format :
Par exemple :
5 et 18  : Erreur il met le 18 avant le 5
Par contre :
05 et 18 : Pas d'erreur !

Utilisation de format :
Strings.Format(5, "000000000.########################") te renvoie "000000005"
Tu tries....
Ensuite tu utilise Val(chaine) pour ravoir les nombres formatés comme avant dans ta listview

__________________________
Julien.
0
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009
9 janv. 2007 à 13:40
bonjour,

je t'es mit  une partie d'une de mes source (un logiciel de mail) j'y est fait un tri des colonne d'un listview grace a une classe implemente de IComparer  est sa marche tres bien :

#Region "Trier Colonne"

    Private Sub TrierColonne(ByVal e As ColumnClickEventArgs)

        'on definit la colonne

        oTriColonne.Colonne = e.Column

        Me.ListViewItemSorter = oTriColonne 'on definit le comparateur du tri

        Me.Sort() 'on tri les elements

        oTriColonne.Ordre = Not oTriColonne.Ordre

    End Sub

#End Region

    ''''''''''''''''''''''''''''' Classes '''''''''''''''''''''''''''''''''''

#Region "Classe ListViewItemCompare"

    Class ListViewItemComparer

        Implements IComparer

        Private intColonne As Integer

        Private booOrdre As Boolean = True

#Region "Constructeur"

        Public Sub New()

        End Sub

#End Region

        '''''''''''''''''''''' propriété '''''''''''''''''''''''''

#Region "Ordre"

        Public Property Ordre() As Boolean

            Get

                Return booOrdre

            End Get

            Set(ByVal value As Boolean)

                booOrdre = value

            End Set

        End Property

#End Region

#Region "Colonne"

        Public Property Colonne() As Int32

            Get

                Return intColonne

            End Get

            Set(ByVal value As Int32)

                intColonne = value

            End Set

        End Property

#End Region

        ''''''''''''''''''''''''Méthodes'''''''''''''''''''''''''''

#Region "Compare implementé de IComparer"

        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare

            Dim intNum As Integer

            intNum = String.Compare(CType(x, ListViewItem).SubItems(intColonne).Text, CType(y, ListViewItem).SubItems(intColonne).Text)

            If Not booOrdre Then

                Return -intNum

            End If

            Return intNum

        End Function

#End Region

    End Class

#End Region

End Class
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
9 janv. 2007 à 13:41
Un second moyen un peu plus beau mais un peu plus chaud :
Tu crée ton propre comparateur d'objets et tu l'attribue à ton listview :

Public Class Form1
  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim c As New MyComparer
    ListView1.ListViewItemSorter = c
  End Sub
End Class

Public Class MyComparer
  Implements IComparer

  Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
               'Amuse-toi bien ...
  End Function
End Class, ----
(Coloration syntaxique automatique par Kenji)

Là où j'ai mis 'Amuse-toi bien, tu dois gérer les comparaisons possibles selon les type de x et de y...
C'est pas compliqué mais c'est fastidieux...
__________________________
Julien.
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
9 janv. 2007 à 13:42
Salut,

          Si en faite ca fonctionne j'ai tout simplement retiré de ton code la ligne où tu testes si i = Index et ca fonctionne parfaitement parce qu'en faite quand je cliqué sur les colonnes où il y avait des nombres rien ne se passait après voir supprimé cette ligne le tri s'effectue bien sur ces colonnes.
0

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

Posez votre question
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009
9 janv. 2007 à 13:45
ok sinon j'ai mis le icompare
0
Rejoignez-nous