![](/img/trans.png)
[英]Flex DataGrid with variable custom itemEditor on a 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.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"/>
瞧! 它工作順利。
我經常發現使用標准數據字段更容易,而只需在我的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.