Tri personnel dans un DataView

Résolu
chaudakh Messages postés 8 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 10 mars 2011 - 26 févr. 2011 à 13:49
laurent.cpasmoi Messages postés 7 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 29 décembre 2012 - 29 déc. 2012 à 16:01
Bonjour à tous,

Voici la situation : J'ai un DataTable dt dont l'une des colonnes, disons "couleur_ceinture", contient la couleur de ceinture de judo du membre. Il s'agit donc d'une "String".

J'ai un DataView dv que je déclare comme :
Dim dv as DataView = dt.DefaultView


J'ai une DataGridView dgv que j'ai reliée au DataView dv :
dgv.DataSource = dv


Quand je clique sur le Header de la colonne "couleur_ceinture" du DataGridView dgv, j'obtiens un tri alphabétique (normal, c'est par défaut, puisque la colonne du DataTable associé contient des "String"). J'aimerais obtenir un tri personnel, par exemple en fonction de la force de la couleur de la ceinture, soit :

blanche < jaune < orange < verte < bleue < marron < noire


Je ne sais absolument pas comment réaliser ce tri personnel. Si j'intercepte par exemple le clic sur le Header de la colonne, la méthode .Sort de la classe DataView ne me permet même pas de réaliser cela, car je n'ai que les options ASC ou DESC. du style : dv.Sort = "couleur_ceinture ASC"

Pour une DataGridView simple, il suffirait par exemple de personnaliser la méthode SortCompare, mais l'aide MSDN indique que l'événement ne se déclenche pas pour une DataGridView reliée à une DataSource.

Votre aide est vraiment la bienvenue !

2 réponses

chaudakh Messages postés 8 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 10 mars 2011
10 mars 2011 à 10:30
Voici finalement comment j'ai procédé, même si c'est vraisemblablement pas la méthode la plus performante.

Vu que je n'arrive pas à surcharger ou écraser la méthode de tri, le plus simple est de créer une colonne additionnelle dans la DataTable :
MonDataSet.Tables("MaTable").Columns.Add("tri_perso", GetType(Integer))


Une fois qu'on a fait la jonction entre le DataSet et le DataGridView via la propriété .DataSource, on impose :
With MonDataGridView
.Columns("couleur_ceinture").SortMode = DataGridViewColumnSortMode.Programmatic
.columns("tri_perso").Visible = False
End With


Il suffit enfin d'intercepter le clic sur le Header de la colonne "couleur_ceinture", de peupler la colonne du tri perso dans le DataSet et de trier par rapport à cette colonne :
Private Sub MonDataGridView_ColumnHeaderMouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles MonDataGridView.ColumnHeaderMouseClick

 Dim txt_column As String

 If e.ColumnIndex =MonDataGridView.Columns("couleur_ceinture").Index Then

            txt_column = "couleur_ceinture"

            ' On peuple la colonne tri_perso du DataSet avant lancement du tri
            For ii = 0 To MonDataSet.Tables("MaTable").Rows.Count - 1
                MonDataSet.Tables("MaTable").Rows(ii).Item("tri_perso") = Color2Integer(MonDataSet.Tables("MaTable").Rows(ii).Item(txt_column))
            Next

            ' On trie
            If MonDataGridView.Columns(txt_column).HeaderCell.SortGlyphDirection = SortOrder.None Or _
MonDataGridView.Columns(txt_column).HeaderCell.SortGlyphDirection = SortOrder.Descending Then

                MonDataSet.Tables("MaTable").DefaultView.Sort "tri_perso DESC"                MonDataGridView.Columns(txt_column).HeaderCell.SortGlyphDirection SortOrder.Ascending
            Else
                MonDataSet.Tables("MaTable").DefaultView.Sort = "custom_sort ASC"
                MonDataGridView.Columns(txt_column).HeaderCell.SortGlyphDirection = SortOrder.Descending
            End If

        End If

End Sub


Avec la fonction Color2Integer une fonction qui convertit la force de la ceinture en entier, du genre :
Private Function Color2Integer(ByVal couleur as String) as Integer

Dim ColorRange() as String = {"blanche","jaune","orange","verte","bleue","marron","noire"}

Return Array.IndexOf(ColorRange,color)

End Function


La solution me satisfait que moyennement car j'aurais préféré intervenir directement sur la méthode de tri du DataView... Si quelqu'un sait faire, qu'il n'hésite pas à partager ses connaisssances :P
3
laurent.cpasmoi Messages postés 7 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 29 décembre 2012
29 déc. 2012 à 16:01
Je suis confronté au même problème que toi... as-tu trouver entre temps une méthode de tri directement au niveau du datagridview ?
0
Rejoignez-nous