簡體   English   中英

擴展Flex DataGridColumn以實現自定義排序功能

[英]Extending Flex DataGridColumn for custom sorting function

我伸出的DataGridColumn,因為我想有一個自定義的itemToLabel功能(能夠在DataGrid中顯示嵌套數據,請參見問題。

無論如何,它還需要一個自定義的排序功能。 所以我寫了這樣的排序功能:

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
}

在我的CustomDataGridColumn的構造函數中,我輸入:super(columnName); sortCompareFunction = mySortCompareFunction;

每當我嘗試對列進行排序時,都會出現錯誤“ Error: Find criteria must contain at least one sort field value.

當我調試並逐步執行每個步驟時,我發現前幾次都正確調用了該函數,但是最后,會出現此錯誤。

有人可以說明一下這里發生的事情嗎?

謝謝。

我也看到了此錯誤,並且將其跟蹤到包含“ null”的單元格之一。 如果我沒記錯的話,當其中一列具有錯誤的“ dataField”屬性時,也會出現此錯誤。

心連心,

科恩·溫

只是為了說明我到底如何解決了這個問題(為了他人的利益):

我沒有使用dataField屬性(由於要從嵌套對象獲取數據,所以我一直data.title分配諸如data.namedata.title類的東西),而是創建了自己的字段nestedDataField並使它可綁定。 所以我的代碼現在基本上看起來像這樣:

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

然后,將我的dataField條目分配給該新變量

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

瞧! 它工作順利。

我經常發現使用標准數據字段更容易,而只需在我的valueObject中編寫一個getter函數以用作數據字段。 例如:

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

解決問題的最簡單方法是通過labelFunction更改dataField =“ obj.atributte”。 如果需要,也可以添加sortCompareFunction。

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

改變

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM