2009-08-25 79 views
0

我伸出的DataGridColumn,因爲我想有一個自定義的itemToLabel函數(能在DataGrid中顯示嵌套的數據。見this問題。擴展Flex的DataGridColumn自定義排序功能

不管怎麼說,這也需要一個定製。排序功能,所以我寫了排序功能,像這樣:

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的構造,我已經把: 超(列名); sortCompareFunction = mySortCompareFunction;

每當我試着列進行排序,我得到的錯誤「Error: Find criteria must contain at least one sort field value.

當我調試,並通過每一個步驟,我看到的第幾次,函數的調用是否正確,但接近尾聲,會發生此錯誤。

有人可以澄清一下這裏發生的事情嗎?

謝謝。

回答

1

我也看到了這個錯誤,並將其追蹤到其中一個包含'null'的單元格。 如果我沒有記錯的話,這個錯誤也會出現,當其中一列出現錯誤的'dataField'屬性時。

心連心,

公園Weyn

+0

我覺得你只是解決了我的問題上,我花費近6個小時爲止。謝謝。如果可以的話,我會再投你一票;) – 2009-08-26 10:04:00

1

只是爲了說明我究竟是如何解決這個問題(爲他人謀取利益):

除了使用dataField財產(到我指定的東西的像data.name,data.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"/> 

你瞧!它工作順利。

1

我經常發現使用標準數據字段比較容易,只需在我的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"/> 
1

解決該問題的最簡單的方法是通過一個的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);