chaudakh
Messages postés8Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention10 mars 2011
-
26 févr. 2011 à 13:49
laurent.cpasmoi
Messages postés7Date d'inscriptionsamedi 22 novembre 2003StatutMembreDernière intervention29 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 :
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.
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