2009-08-25 5 views
0

I a étendu la DataGridColumn parce que je voulais inclure une fonction de itemToLabel personnalisé (pour pouvoir afficher les données imbriquées dans le DataGrid. Voir this question.Extension Flex DataGridColumn pour la fonction de tri personnalisée

Quoi qu'il en soit, il faut aussi une coutume . fonction de tri J'ai écrit la fonction de tri comme ceci:

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 mon CustomDataGridColumn, j'ai mis: super (columnName); sortCompareFunction = mySortCompareFunction;

Chaque fois que j'essaie de trier la colonne, je reçois l'erreur « Error: Find criteria must contain at least one sort field value. »

Quand je déboguer et à l'étape à chaque étape, je vois que les premières fois, la fonction est appelée correctement, mais vers la fin , cette erreur se produit.

Quelqu'un peut-il faire la lumière sur ce qui se passe ici?

Merci.

Répondre

1

J'ai également vu cette erreur, et je l'ai suivie jusqu'à l'une des cellules contenant 'null'. Et si je me souviens bien, cette erreur apparaît également lorsque l'une des colonnes a un mauvais attribut 'dataField'.

HTH,

Koen Weyn

+0

Je pense que vous venez résolu mon problème sur lequel je passe près de 6 heures jusqu'à présent. Je vous remercie. Je vous voterais plus si je le pouvais;) –

1

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

Au lieu d'utiliser la propriété dataField (à laquelle j'assigne 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'ai rendu liable. Donc, mon code ressemble fondamentalement à 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 
} 
} 

Puis-je céder à cette nouvelle variable mon entrée dataField

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

et voilà! cela fonctionne sans accroc.

1

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

//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"/> 
1

La meilleure façon de résoudre le problème est de changer le dataField = « obj.atributte » par un labelFunction. Si vous voulez, vous pouvez aussi ajouter un 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); 
Questions connexes