Tri DataGridView avec des dates

Résolu/Fermé
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 - Modifié par Anonyme209 le 21/05/2015 à 19:37
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 - 22 mai 2015 à 19:04
Bonjour,

Dans la colonne de ma DataGridView, j'ai diverses dates.
Je voudrais que ma DataGridView trie mes données en fonction des dates par ordre chronologique et inversement.

Avec DataGridView.Sort, les dates sont triées comme du texte normal, et ça donne ça:

01/01/2001 00:00
20/10/2015 00:00
30/05/2014 00:00


Merci de votre aide.

2 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
22 mai 2015 à 08:03
Bonjour,

Il faut que tu indiques le Type Date et non pas String dans ta colonne.

Voir ceci:

https://www.developpez.net/forums/d897729/dotnet/langages/vb-net/trier-colonne-type-date-datagridview/
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
22 mai 2015 à 16:35
Bonjour,
J'ai essayé:
DataGridView1.Columns(0).ValueType = GetType(Date)


mais ça ne marche pas mieux
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
22 mai 2015 à 17:19
Tu peux te servir d'un comparateur comme pour une listView.

Voici le code:

Private Sub DataGridView1_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
        'Récupérer le composant
        Dim grid As DataGridView = DirectCast(sender, DataGridView)
        'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
        Dim colonneDate As String = "Date" 'a adapter
        'Traitement en fonction de la colonne où se situe la cellule en cours d'édition 
        Select Case e.Column.Name
            Case colonneDate
                e.SortResult = System.DateTime.Compare(CDate((e.CellValue1)), CDate((e.CellValue2)))
                e.Handled = True
        End Select
    End Sub
    'on peut mettre ce code dans un bouton
    Private Sub DataGridView1_ColumnHeaderMouseDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseDoubleClick
        With DataGridView1
            .Sort(.Columns("Date"), System.ComponentModel.ListSortDirection.Descending)
        End With
    End Sub
    'on peut mettre ce code dans un bouton
    Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
        With DataGridView1
            DataGridView1.Sort(.Columns("Date"), System.ComponentModel.ListSortDirection.Ascending)
        End With
    End Sub

0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
22 mai 2015 à 18:18
Bonjour,

Le code fonctionne mais altère le fonctionnement de mon programme.
Y-aurait-il un composant (même non directement intégré) qui trie automatiquement dans l'ordre chronologique?
Je n'aurais qu'à mettre mes lignes dans ce composant et à les remettre dans mon datagridview dans le bon ordre.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728 > Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020
22 mai 2015 à 18:30
Dans l'exemple que je t'ai montré, il n'y a qu'une colonne, il faut mettre toutes les colonne et voir si cela n'altère pas ton programme:

'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
        Dim colonneDate As Date = "Date" 'a adapter
       Dim colonneNom As String= "Nom" 'a adapter
'etc.
        'Traitement en fonction de la colonne où se situe la cellule en cours d'édition 
        Select Case e.Column.Name
            Case colonneDate
                e.SortResult = System.DateTime.Compare(CDate((e.CellValue1)), CDate((e.CellValue2)))
                e.Handled = True
             Case colonneNom
                e.SortResult = System.DateTime.Compare(String((e.CellValue1)), String((e.CellValue2)))
                e.Handled = True
.        End Select
'etc.


Corrige:
Dim colonneDate As Date = "Date" 'a adapter
au lieu de
Dim colonneDate As String = "Date" 'a adapter



Sinon dernière option, mettre les dates à l'américaine comme pour les photos:
2015/02/15
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
22 mai 2015 à 19:04
J'ai réussi à trouver et à résoudre le problème de compatibilité avec ton premier code, et il fonctionne maintenant parfaitement.
Merci beaucoup de ton aide.
0