0 votes

Extension de Flex DataGridColumn pour une fonction de tri personnalisée

J'ai étendu la colonne DataGridColumn parce que je voulais inclure une fonction itemToLabel personnalisée (pour pouvoir afficher des données imbriquées dans la grille de données). Voir cette question.

Quoi qu'il en soit, il a également besoin d'une fonction de tri personnalisée. J'ai donc écrit la fonction de tri comme suit :

private function mySortCompareFunction(obj1:Object, obj2:Object):int{
    var currentData1:Object = obj1;
    var currentData2:Object = obj2;

    //some logic here to get the currentData if the object is nested.

    if(currentData1 is int && currentData2 is int){
        var int1:int = int(currentData1);
        var int2:int = int(currentData2);
        var result:int = (int1>int2)?-1:1; 
        return result;
    }
    //so on for string and date
}

Et dans le constructeur de ma CustomDataGridColumn, j'ai mis : super(columnName) ; sortCompareFunction = mySortCompareFunction ;

Chaque fois que j'essaie de trier la colonne, j'obtiens l'erreur " Error: Find criteria must contain at least one sort field value. "

Lorsque je débogue et que je passe en revue chaque étape, je constate que les premières fois, la fonction est appelée correctement, mais que vers la fin, cette erreur se produit.

Quelqu'un peut-il nous éclairer sur ce qui se passe ici ?

Merci.

1voto

Koen Weyn Points 569

J'ai également rencontré cette erreur, et j'ai découvert que l'une des cellules contenait "null". Et si je me souviens bien, cette erreur apparaît également lorsque l'une des colonnes a un attribut "dataField" erroné.

hth,

Koen Weyn

1voto

anand_trex Points 3199

Juste pour préciser comment j'ai résolu ce problème (pour le bénéfice des autres) :

Au lieu d'utiliser le dataField (à laquelle j'assignais quelque chose comme data.name , data.title puisque j'obtenais des données d'un objet imbriqué), j'ai créé mon propre champ nestedDataField et l'a rendu liant. Mon code ressemble donc à ceci maintenant :

public class DataGridColumnNested extends DataGridColumn{
[Bindable] public var nestedDataField:String;

private function mySortCompareFunction(obj1:Object, obj2:Object):int{
    var currentData1:Object = obj1;
    var currentData2:Object = obj2;

    //some logic here to get the currentData if the object is nested.

    if(currentData1 is int && currentData2 is int){
        var int1:int = int(currentData1);
        var int2:int = int(currentData2);
        var result:int = (int1>int2)?-1:1; 
        return result;
    }
    //so on for string and date
}
}

J'affecte ensuite à cette nouvelle variable mon entrée dataField

<custom:DataGridColumnNested headerText="Name" nestedDataField="data.name"/>

Et voilà, cela fonctionne sans problème.

1voto

David Vermeir Points 11

Je trouve souvent plus facile d'utiliser le champ de données standard et d'écrire une fonction getter dans mon objet de valeur à utiliser comme champ de données. Par exemple, j'écris une fonction getter dans mon objet valueobject pour l'utiliser comme champ de données :

//file SomeObject.as with a nested object as property
public class SomeObject
{
   public var someProperty:AnotherObject;

   public function get someString():String;
   {
     if(someProperty)
        return someProperty.someString;
     else
        return "";
   }
}

//your nested class, AnotherObject.as
public class AnotherObject
{
   public var someString:String;
}

//this way sorting and the label will work without custom label/compare functions
<mx:DataGridColumn headerText="" dataField="someString"/>

1voto

AntuanF1 Points 11

La façon la plus simple de résoudre le problème est de remplacer le champ dataField="obj.atributte" par une fonction labelFunction. Si vous le souhaitez, vous pouvez également ajouter une fonction sortCompareFunction.

    <mx:DataGridColumn headerText="email" 
dataField="user.email" textAlign="center" />

changement par

    <mx:DataGridColumn headerText="email" 
labelFunction="emailLabelFunction" 
sortCompareFunction="emailsCompareFunction2" 
textAlign="center" />

public static function emailLabelFunction(item:Object, column:DataGridColumn):String{

   if (item!=null){
    var user:User = (item as TpAnnouncementUser).user as User;

    return user.email;
   }else{

    return "";
   }
}

public static function emailCompareFunction(obj1:Object, obj2:Object):int{

    var dato1:String = User(obj1).email.toLowerCase();
    var dato2:String = User(obj2).email.toLowerCase();

    return ObjectUtil.compare(dato1, dato2);

}

    public static function emailsCompareFunction2(obj1:Object, obj2:Object):int{

    var dato3:User = (TpAnnouncementUser(obj1).user as User);
    var dato4:User = (TpAnnouncementUser(obj2).user as User);

    return emailCompareFunction(dato3, dato4);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X