Magazine Internet

DateFormatter et le tri sur les dates

Publié le 05 novembre 2007 par Stef1

J'ai un datagrid qui liste le contenu d'un répertoire. A ce niveau là pas de soucis, je veux afficher la date dans une colonne, et là je me retrouve avec la date complète en anglais à peu près comme ça "Sat Nov 30 01:20:00 GMT-0800 1974".

Il existe dans le package mx.formatters une classe DataFormatter, génial ....

Donc  on teste
    Avant de boucler sur le contenu de  mon répertoire je crée mon objet DateFormatter

            var dateFormatter:DateFormatter = new DateFormatter();
            dateFormatter.formatString ="DD/MM/YYYY";

Puis je boucle sur le contenu du répertoire et pour chaque  item je crée un objet myfile:File.

                // Je récupère la date du fichier ( j'ai eu des problèmes avec Tiger.... )
            var dateObjet:Date = myfile.creationDate;
                // Et je la mets au format défini par formatString  précedemment.
            var laDate:String = dateFormatter.format(dateObjet);

            Ensuite on en fait ce que l'on veut, moi je reconstruit un objet pour chaque fichier de ma boucle et je place tout ça dans un tableau qui se trouve être le dataprovider de mon datagrid.

Puis j'affiche ma date formatée dans une colonne, et c'est  là que se pose  le problème, comme c'est devenu une chaine de caractère (DateFormatter retourne un type String), quand je clic sur le header pour trier, j'obtiens n'importe quoi :(

Je remercie PhilFlash pour la solution http://philflash.inway.fr/flex/dgsimple/dgsimple.html
Donc on oubli tout ce que l'on vient de faire :)

On laisse la date dans  son format d'origine pour le moment et c'est sur le datagrid que l'on va faire les traitements.

Sur chaque colonne d'un datagrid on à l'évenement labelFunction qui comme son l'indique permet de déterminer une fonction pour le label ( c'est facile l'anglais, non ?  :) )

<mx:DataGridColumn headerText="DATE" dataField="date" width="45" labelFunction="showDate" sortCompareFunction="dateCompareFunction"/>

            private function showDate(item:Object, column:DataGridColumn):String
            {    
                if (dateFormat == null) {
                    dateFormat = new mx.formatters.DateFormatter();
                    dateFormat.formatString = "DD/MM/YY";
                }   
                var field:String =  column.dataField;    
                return dateFormat.format(item[field]);
            }

Donc oui ça retourne un type String, mais c'est juste pour l'affichage, les objets de notre dataprovider ont encore un vrai objet Date.

Et pour le tri
<mx:DataGridColumn headerText="DATE" dataField="date" width="45" labelFunction="showDate" sortCompareFunction="dateCompareFunction"/>

On utilise  sortCompareFunction de datagridColumn et on lui affecte une fonction de tri

     private function dateCompareFunction(obj1:Object, obj2:Object):int {
                var result:int = 0;
                result = ObjectUtil.dateCompare(obj1.date, obj2.date);
                return result;
            }

  Et là ça fonctionne  :), un bel affichage et un tri.

N'oubliez pas de faire un import des classes
    import mx.utils.ObjectUtil;
    import mx.formatters.DateFormatter;


Retour à La Une de Logo Paperblog

A propos de l’auteur


Stef1 Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte