2009-08-25 7 views
0

ich die Datagrid verlängert, weil ich eine benutzerdefinierten itemToLabel Funktion (in der Lage sein zu zeigen, verschachtelte Daten im Datagrid. Siehe this Frage.Erweiterung Flex Datagrid für benutzerdefinierte Sortierfunktion

Anyways, es braucht auch eine benutzerdefinierte einschließen wollte . Sortierfunktion so habe ich die Sortierfunktion wie so geschrieben:

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 
} 

Und im Konstruktor meines CustomDataGridColumn, habe ich gesagt: Super (column); sortCompareFunction = mySortCompareFunction;

Jedes Mal, wenn ich versuche, die Spalte zu sortieren, erhalte ich die Fehlermeldung „Error: Find criteria must contain at least one sort field value.

Wenn ich debuggen und durch jeden Schritt für Schritt, wie ich sehe, dass die ersten paar Male, wird die Funktion korrekt aufgerufen werden, aber gegen Ende , dieser Fehler tritt auf.

Kann jemand bitte etwas Licht auf das, was hier passiert, werfen?

Danke.

Antwort

1

Ich habe diesen Fehler auch gesehen, und ich habe es auf eine der Zellen mit 'Null' verfolgt. Und wenn ich mich richtig erinnere, wird dieser Fehler auch angezeigt, wenn eine der Spalten ein falsches Attribut 'dataField' hat.

hth,

Koen Weyn

+0

Ich glaube, du mein Problem nur auf dem löste ich fast 6 Stunden damit verbringen, so weit. Vielen Dank. Ich würde dich mehr wählen, wenn ich könnte;) –

1

nur angeben, wie genau ich dieses Problem gelöst (zum Nutzen anderer):

Statt die dataField Eigenschaft der Verwendung von (zu denen ich etwas zuweisen wie data.name, data.title seit ich Daten von einem verschachtelten Objekt erhalten habe), habe ich mein eigenes Feld nestedDataField erstellt und es binableable gemacht. Also mein Code sieht im Grunde wie folgt nun:

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 
} 
} 

Dann ordne ich auf diese neue Variable mein Eintrag datafield

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

Und siehe da! es funktioniert ohne Probleme.

1

Ich finde es oft einfacher, das Standard-Datenfeld zu verwenden und schreibe einfach eine Getter-Funktion in mein Wertobjekt, um es als Datenfeld zu verwenden. Zum Beispiel:

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

Der einfachste Weg, um das Problem zu lösen, ist die = „obj.atributte“ durch eine labelfunction datafield ändern. Wenn Sie möchten, können Sie auch eine sortCompareFunction hinzufügen.

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

Änderung von

<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);