Multi tri datagridview

edwinzap - 16 mars 2013 à 13:57
 edwinzap - 16 mars 2013 à 16:32
Bonjour.
J'ai pourtant cherché longtemps mais je n'arrive pas à faire un tri sur plusieurs colonne d'un datagridview. Pourriez-vous m'aider.
En fait comme la colonne ne se trie pas correctement si je laisse le tri automatique j'ai donc fais un tri par programmation. Voici mon code:
 Private Sub DGV_J_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV_J.ColumnHeaderMouseClick
        Dim Colonne_index As DataGridViewColumn = DGV_J.Columns(e.ColumnIndex)
        Dim Direction = DGV_J.SortOrder
        If Colonne_index.Index = 1 Then
            Select Case Direction
                Case (SortOrder.None)
                    DGV_J.Sort(DGV_J.Columns("YEAR, Date"), System.ComponentModel.ListSortDirection.Descending)
                    DGV_J.Columns("date").HeaderCell.SortGlyphDirection = SortOrder.Descending
                Case SortOrder.Descending
                    DGV_J.Sort(DGV_J.Columns("YEAR, Date"), System.ComponentModel.ListSortDirection.Ascending)
                    DGV_J.Columns("date").HeaderCell.SortGlyphDirection = SortOrder.Ascending
                Case SortOrder.Ascending
                    DGV_J.Sort(DGV_J.Columns("YEAR, Date"), System.ComponentModel.ListSortDirection.Descending)
                    DGV_J.Columns("date").HeaderCell.SortGlyphDirection = SortOrder.Descending
            End Select
        End If
    End Sub


Basé sur cette requête:
        Dim dsj As New DataSet
        Dim R_jour
        R_jour =
            "SELECT year(date1) as [YEAR], " & _
            "format(date1, 'dddd dd MMMM YYYY') as [Date], " & _
            "format(int(sum(veille)/3600),'00') & ':' & format(int(sum(veille)/60)-60*int(sum(veille)/3600),'00') &':'& format(sum(veille)-60*int(sum(veille)/60),'00') as [Veille], " & _
            "format(dateadd('s', -sum(veille), sum(date2-date1)), 'hh:mm:ss') as [Temps Travail], " & _
            "format(sum(date2-date1), 'hh:mm:ss') as [Temps Total]" & _
            "FROM temps " & _
            "GROUP BY year(date1), format(date1, 'dddd dd MMMM YYYY')" & _
            "ORDER BY year(date1) DESC, format(date1, 'dddd dd MMMM YYYY') DESC"
        cmd = New OleDb.OleDbCommand(R_jour, con)
        cmd.Connection.Open()
        da.SelectCommand = cmd
        da.Fill(dsj, "temps")
        dt = dsj.Tables("temps")
        Form_Historique.DGV_J.DataSource = dt
        cmd.Connection.Close()


Je sais bien que "DGV_J.Sort(DGV_J.Columns("YEAR, Date")" ne peut pas fonctionner mais c'est pour montrer sur qu'elles colonnes je veux trier.

Merci de m'aider.

5 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
16 mars 2013 à 15:01
Bonjour,

ORDER BY year(date1) DESC, format(date1, 'dddd dd MMMM YYYY') DESC

Donc tu trie d'abord par l'année (ok), puis par le nom du jour, son numéro dans le mois, le mois puis l'année.

Et si tu faisais directement :
Order By date1 DESC

Mais comme tu ne donnes pas d'exemple de données et de tri, pas possible d'en dire plus.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
0
Effectivement ce serait nettement plus facile de trier directement par date1, mais ce n'est pas possible.
En effet, si je fais ceci:
            "SELECT date1 as [D], " & _
            "format(date1, 'dddd dd MMMM YYYY') as [Date], " & _
            "format(int(sum(veille)/3600),'00') & ':' & format(int(sum(veille)/60)-60*int(sum(veille)/3600),'00') &':'& format(sum(veille)-60*int(sum(veille)/60),'00') as [Veille], " & _
            "format(dateadd('s', -sum(veille), sum(date2-date1)), 'hh:mm:ss') as [Temps Travail], " & _
            "format(sum(date2-date1), 'hh:mm:ss') as [Temps Total]" & _
            "FROM temps " & _
            "GROUP BY date1, format(date1, 'dddd dd MMMM YYYY')" & _
            "ORDER BY date1 DESC"

la requête ne regroupe plus aucun élément (elle ne regroupe plus par jour). Avez-vous une idée pourquoi?
0
Utilisateur anonyme
16 mars 2013 à 15:45
Salut,

En fait comme la colonne ne se trie pas correctement si je laisse le tri automatique

Personnellement, je ferais des classes différentes implémentant IComparer pour le tri automatique des colonnes :
Option Strict On
Public Class Form1
    Dim WithEvents dtgv As New DataGridView With {.Parent Me, .Bounds New Rectangle(0, 0, 300, 300)}
    Dim tri As Integer
    Dim rd As New Random

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        dtgv.Columns.Add("chiffres", "chiffres")
        dtgv.Columns.Add("dates", "dates")
        dtgv.Columns.Add("blabla", "blabla")
        For y = 1 To 12
            Dim row As New DataGridViewRow
            row.CreateCells(dtgv, {y.ToString, New DateTime(rd.Next(1990, 2014), rd.Next(1, 13), rd.Next(1, 31)).ToShortDateString, rd.Next(0, 50)})
            dtgv.Rows.Add(row)
        Next
    End Sub

    Private Sub dtgv_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dtgv.ColumnHeaderMouseClick
        If tri 1 Then tri 0 Else tri = 1
        Select Case e.ColumnIndex
            Case 1
                dtgv.Sort(New clsSorterDate(tri, e.ColumnIndex))
            Case 0
                dtgv.Sort(New clsSorter(tri, e.ColumnIndex))
            Case 2
                dtgv.Sort(New clsSorter(tri, e.ColumnIndex))
        End Select
    End Sub
End Class

Public Class clsSorter
    Implements IComparer
    Dim _dir As System.ComponentModel.ListSortDirection
    Dim _colonne As Integer
    Sub New(ByVal dir As Integer, ByVal colonne As Integer)
        _colonne = colonne
        Select Case dir
            Case 0
                _dir = System.ComponentModel.ListSortDirection.Ascending
            Case 1
                _dir = System.ComponentModel.ListSortDirection.Descending
        End Select
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim vx As Integer = CType(CType(x, DataGridViewRow).Cells(_colonne).Value, Integer)
        Dim vy As Integer = CType(CType(y, DataGridViewRow).Cells(_colonne).Value, Integer)

        Select Case _dir
            Case System.ComponentModel.ListSortDirection.Ascending
                If vx < vy Then
                    Return 1
                ElseIf vx = vy Then
                    Return 0
                Else
                    Return -1
                End If
            Case System.ComponentModel.ListSortDirection.Descending
                If vx < vy Then
                    Return -1
                ElseIf vx = vy Then
                    Return 0
                Else
                    Return 1
                End If
        End Select
        Return Nothing
    End Function
End Class

Public Class clsSorterDate
    Implements IComparer
    Dim _dir As System.ComponentModel.ListSortDirection
    Dim _colonne As Integer

    Sub New(ByVal dir As Integer, ByVal colonne As Integer)
        _colonne = colonne
        Select Case dir
            Case 0
                _dir = System.ComponentModel.ListSortDirection.Ascending
            Case 1
                _dir = System.ComponentModel.ListSortDirection.Descending
        End Select
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim vx As Date = CType(CType(x, DataGridViewRow).Cells(_colonne).Value, Date)
        Dim vy As Date = CType(CType(y, DataGridViewRow).Cells(_colonne).Value, Date)

        Select Case _dir
            Case System.ComponentModel.ListSortDirection.Ascending
                If vx < vy Then
                    Return 1
                ElseIf vx = vy Then
                    Return 0
                Else
                    Return -1
                End If
            Case System.ComponentModel.ListSortDirection.Descending
                If vx < vy Then
                    Return -1
                ElseIf vx = vy Then
                    Return 0
                Else
                    Return 1
                End If
        End Select
        Return Nothing
    End Function
End Class
0
Oulah !!! Fort compliqué pour ce que je veux faire.
Le problème ne se situe pas là. Je voudrait simplement trier par date correctement. Mon bout de code qui tri par programmation fonctionne parfaitement, c'est juste que je n'arrive pas à trier correctement la colonne date par date justement. L'idée de NHenry pourrait fonctionner mais le problème est que la requête R_jour comme je l'ai insérer dans le second poste ne fais plus le regroupement par jour alors que j'ai mis "GROUP BY date1, format(date1, 'dddd dd MMMM YYYY')".
C'est là qu'il y a un problème !
0

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

Posez votre question
J'ai finalement trouvé un autre moyen.
En effet, si je trie en utilisant DAY(date1) le tri se fait correctement. (de même pour YEAR(date1), MONTH(date1)).
Je n'ai donc plus besoin de trie sur plusieurs colonne.
Il ya juste que pour la requête R_semaine, j'ai du formater comme ceci: format(date1, 'YYYY ww')
Je n'ai d'ailleurs encore trouver aucun moyen pour afficher le premier et le dernier jour de la semaine du genre: "Du 10/03/2013 au 17/03/2013" dans la requête R_semaine qui est regroupée par format(date1, 'YYYY ww').

Si quelqu'un a une idée je suis prenant !!!
0
Rejoignez-nous