IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Trier une colonne de type date dans un datagridview


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Trier une colonne de type date dans un datagridview
    Bonjour à tous !

    Voici mon problème : Je cherche à trier une colonne par date sur un datagridview.
    Ce qu'il se passe actuellement est que le datagridview considère la colonne comme de format string et non date. Je me retrouve avec des enregistrements ayant une date au 17/01/2010 avant ceux ayant une date au 20/03/2010 par exemple (pour un tri croissant).

    Mon datagridview est alimenté par bindingsource.datasource qui lui-même est alimenté par un dataset / datatable.
    Le datatable est lui alimenté par une variable de type array : myDT.Rows.Add(strRow)
    J'ai déjà essayé d'utiliser les évènements sortcompare et sorted mais ils ne fonctionne pas (j'ai eu la confirm sur msdn). En revanche, j'arrive bien à rentrer dans le ColumnHeaderMouseClick.

    Quelqu'un aurait-il une idée pour m'aider ?


    Merci d'avance,
    Etienne

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    A priori il suffit que la colonne du DataTable soit de type DateTime, vu que le tri par défaut utilise le comparateur associé au type de la colonne

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    A priori, c'est ce que je pensais aussi.
    Pour mon test, j'ai donc rempli mon tableau avec une variable de type datetime.
    Dans le debuggeur, lorsque je regarde la description de tous les champs du tableau, la valeur contenant la date est alimentée comme ça :
    #20/03/2010# {Date}

    Malheureusement, ça n'a rien changé au résultat...

    Une autre idée ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    De quel "tableau" tu parles ? c'est bien une DataTable ? Dans ce cas l'important est le type déclaré de la colonne

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Citation Envoyé par eviolleau Voir le message
    Je me retrouve avec des enregistrements ayant une date au 17/01/2010 avant ceux ayant une date au 20/03/2010 par exemple (pour un tri croissant).
    Bonjour,

    Je vais peut-être dire une débilité quoique, un tri croissant pour des dates c'est bien du plus ancien au plus récent ?
    Dans ce cas les enregistrements datés du 17/01/2010 seront bien avant ceux datés du 20/03/2010 non

    Après reste à voir si c'est l'exemple du post qui est incorrect, une incompréhension du sens de tri, ou autre.

    Cordialement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    ooouuuppssss
    effectivement, c'est bien une erreur de l'exemple...
    j'ai bien un tri incohérent : 17/03/2010 avant le 20/01/2010

    pour répondre à tomlev, en fait mon datatable est alimenté à la "mimine", par un tableau de type array....
    je m'en sers pour formater mes valeurs selon le type (integer, string, date...)
    maintenant, peut être que je ne fais pas les choses en bonne et due forme !?!

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par eviolleau Voir le message
    pour répondre à tomlev, en fait mon datatable est alimenté à la "mimine", par un tableau de type array....
    OK, mais tu le crées comment ? avec le designer, par le code ? Dans tous les cas, il faut bien que tu crées les colonnes à un moment ou un autre, et donc que tu indiques leur type...

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    En fait, le datatable est alimenté par le code.

    Voici un aperçu de la façon dont je l'alimente :
    Pour explication, le datagridview est dynamique. Les colonnes sont stockées dans une table avec leur type, leur nom, leur description, etc... Tout ça est stocké dans un arraylist.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Dim MyReader As OleDbDataReader = MyCmd.ExecuteReader()
    Do While MyReader.Read()
        Dim strRow(descDGV.Count - 1)
        For ind = 0 To descDGV.Count - 1
            Select Case descDGV.DataType(ind)
                Case "TEXTBOX"
                    strRow(ind) = MyReader.GetValue(ind).ToString
                Case "TEXTBOX_NUM"
                    Dim valInt As Double
                    valInt = Convert.ToDouble(Decode(MyReader.GetValue(ind).ToString, "", "0", MyReader.GetValue(ind)))
                    strRow(ind) = valInt.ToString("#,###,###,###,##0.00")
                Case "TEXTBOX_NUM_TX"
                    Dim valInt As Double
                    valInt = Convert.ToDouble(Decode(MyReader.GetValue(ind).ToString, "", "0", MyReader.GetValue(ind)))
                    strRow(ind) = valInt.ToString("#,###,###,###,##0.################")
                Case "TEXTBOX_DATE"
                    Dim valDate As DateTime
                    If MyReader.GetValue(ind).ToString <> "" Then
                        valDate = MyReader.GetValue(ind).ToString
                        If Len(valDate) > 10 Then
                            valDate = valDate.ToString("dd/MM/yyyy hh:mi:ss")
                        Else : valDate  = valDate.ToString("dd/MM/yyyy")
                        End If
                        strRow(ind) = valDate
                    End If
                Case "CHECKBOX"
                        strRow(ind) = Decode(MyReader.GetValue(ind).ToString, "Y", True, False)
            End Select
        Next
        myDT.Rows.Add(strRow)
    Loop
    MyReader.Close()

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par eviolleau Voir le message
    En fait, le datatable est alimenté par le code.
    Oui, ça j'ai bien compris, mais ça ne me dit pas comment elle est créée...
    Tu as bien dû créer les colonnes à un moment ou un autre, sinon myDT.Rows.Add(strRow) lèverait une exception

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    pardon, j'ai oublié ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While descDGV.MoveNext
                            myDT.Columns.Add(descDGV.ColumnName(descDGV.Current))
                        End While
    ça viendrait d'ici ?

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Ah ben voilà l'explication... Si tu ne précises pas le type, par défaut la colonne est de type String. Donc forcément tes dates sont traitées comme des String, et sont donc classées par ordre alphabétique... il faut que tu précises le type de la colonne en 2e paramètre de Add

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Trop fort
    Ca marche nickel !!!

    Un grand merci pour ton aide.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    n'oublie pas le tag si c'est bon
    (bouton en bas de la page)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/02/2011, 00h53
  2. [SP-2007] Ajouter une colonne de type "liste" dans une liste personnalisé
    Par strinty dans le forum SharePoint
    Réponses: 4
    Dernier message: 13/01/2011, 13h26
  3. date 01/01/1900 sur une colonne de type date
    Par tsdia2 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/06/2008, 15h12
  4. [VB.Net/Dataview] Comment gérer un filtre sur une colonne de type date ?
    Par silatchom dans le forum Accès aux données
    Réponses: 3
    Dernier message: 07/07/2006, 19h28
  5. Réponses: 14
    Dernier message: 28/10/2005, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo