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

ASP.NET Discussion :

Tri dynamique sur un champ Date en utilisant la reflexion et les expressions lambda [Débutant]


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut Tri dynamique sur un champ Date en utilisant la reflexion et les expressions lambda
    bonjour

    Il y a quelques temps, j'ai mis au point cette fonction pour trier
    Code vb : 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
     
     Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
                    Dim Typ = pinfo.PropertyType.Name
                    Dim toStr As Expression
     
                    Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
     
                    toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(String.Empty))), "ToString", Nothing)
     
     
                    Dim orderByFunc As Func(Of MaClass, Object) = Expression.Lambda(Of Func(Of MaClass, Object))(toStr, paramExpr).Compile()
                    Dim sortFunc As Func(Of IEnumerable(Of MaClass), IOrderedEnumerable(Of MaClass)) = Nothing
     
                    If (Not CBool(Sort.Sens)) Then
                        sortFunc = (Function(source) source.OrderBy(orderByFunc))
                    Else
                        sortFunc = (Function(source) source.OrderByDescending(orderByFunc))
                    End If
     
                    query = sortFunc(query).ToList()
         End If

    Le problème est date.tostring me donne un tri sur la chaine de caractère et pas sur la date
    Par exemple, je vais avoir
    31/12/2005; 31/11/2011; 31/10/2007
    au lieu de
    31/11/2011; 31/10/2007; 31/12/2005
    J'essai de modifier mon code avec
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     If Typ.Contains("DateTime") Then 'Add For DateTime here
                        toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(Date.MinValue))), "ToString", Nothing)
                    Else
                        toStr = Expression.Call(If(pinfo.PropertyType.IsValueType, Expr, Expression.Coalesce(Expr, Expression.Constant(String.Empty))), "ToString", Nothing)
                    End If
    mais je ne vois pas quoi mettre à la place du ToString pour la date.
    J'ai essayé "ToString(""yyyy MM dd"")"
    Mais j'ai l'erreur
    ex = {"Aucune méthode 'ToString("yyyy MM dd")' n'existe sur le type 'System.Nullable`1[System.DateTime]'."}
    J'ai essayé aussi : Ticks,Date ou Year,Value.Ticks, GetValueOrDefault.Year.ToString mais même erreur

    A moins qu'il y a mieux à faire...

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Par défaut
    Je dirais plutôt que dans la collection qui est retourné il y a une date qui est null et que par conséquent ton tostring ne fonctionne pas...

  3. #3
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Merci de ta réponse

    Ce n'est pas vraiment ce que suggère l'erreur. Et normalement le "Coalesce" doit bloquer ce cas


    Il y a en premier l'erreur que je ne passait pas le paramètre au bon endroit
    J'ai essayé :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toStr = Expression.Call( Expr, "ToString", Nothing, Expression.Constant("yyyy MM dd"))

    Mais merci car pour réussir, je me suis dit que pour répondre à ta question, je change mon Date? en Date. En simplifiant, j'ai réussi à mettre au point le cast...
    Et je me suis demandé si on pouvait mettre un nothing dans un Date... Oui donc Date? est inutile dans mon cas.

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

Discussions similaires

  1. [WD18] Tri sur un champ date
    Par virtualdev dans le forum WinDev
    Réponses: 4
    Dernier message: 26/07/2014, 07h39
  2. Réponses: 3
    Dernier message: 15/06/2006, 12h03
  3. Tri dans une DBGrid sur un champ date au format jj/mm
    Par Jeankiki dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/10/2004, 12h32
  4. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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