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;