Apache flex 如何使用分层数据对AdvancedDataGrid进行排序?
我有一个AdvancedDataGrid,它的数据提供者是HierarchycalCollectionView。当我使用正在使用的数据集查看网格,并单击要排序的列的标题时,一切都很正常。它按照我所期望的方式对其进行分层排序 我现在想做的是,当网格显示给用户时,它已经被排序了。有没有一种方法可以通过编程来实现这一点?我一辈子都想不出如何做到这一点,显然这是可能的,因为AdvancedDataGrid内置了这种功能 编辑-顺便说一句,我试过:Apache flex 如何使用分层数据对AdvancedDataGrid进行排序?,apache-flex,sorting,actionscript,hierarchical-data,advanceddatagrid,Apache Flex,Sorting,Actionscript,Hierarchical Data,Advanceddatagrid,我有一个AdvancedDataGrid,它的数据提供者是HierarchycalCollectionView。当我使用正在使用的数据集查看网格,并单击要排序的列的标题时,一切都很正常。它按照我所期望的方式对其进行分层排序 我现在想做的是,当网格显示给用户时,它已经被排序了。有没有一种方法可以通过编程来实现这一点?我一辈子都想不出如何做到这一点,显然这是可能的,因为AdvancedDataGrid内置了这种功能 编辑-顺便说一句,我试过: var myData:HierarchicalColle
var myData:HierarchicalCollectionView = new HierarchicalCollectionView(theDataSource);
// Works fine using only the line above and clicking the header to sort.
// This is the part that I tried adding:
var sort:Sort = new Sort();
sort.fields = [new SortField("startDate")];
myData.sort = sort;
myData.refresh();
就排序而言,这似乎起到了一定作用,但排序方式与单击列标题不同。“startDate”是数据源中对象的属性。您可以创建一个新的高级数据网格排序事件,并在网格上设置分层数据后将其分派到网格上(不幸的是,我不得不使用callLater来给网格时间在内部处理集合—似乎ADG的数据提供者的分配有时是异步的) 这段代码来自ADG的一个扩展,因此如果您不创建扩展,您可能希望dispatchEvent实际位于网格实例上 代码中还有一个注释:
//setting sortDescending=true on a column does not work as expected. so, until a solution
//is found, this works just as well. the event that is dispatch just tells the column
//to reset. so, one resorts ascending (the default), while a second resorts descending.
//however, this second is only dispatched if defaultSortDesc is true on the grid.
if (defaultSortDesc)
{
dispatchEvent(advancedDataGridEvent);
}
它将事件分派两次以翻转排序。看起来您想要对日期进行排序。
排序
无法在开箱即用。您必须使用比较功能
如果对象的类型为Date
,则很容易:
var sortField:SortField = new SortField("startDate");
sortField.compareFunction = ObjectUtil.dateCompare;
如果列包含日期作为字符串,则必须首先对其进行解析(代码示例来自:
然后像您在示例中所做的那样使用
sortField
。这应该很好。当对象的类型为Date
时,我不确定是否需要该比较函数。现在无法测试它……它不需要比较函数。我意外地包含了新sortField(“startDate”,true)
,但我认为日期不会区分大小写,所以将其更改为removetrue
有效。
var sortField:SortField = new SortField("startDate");
sortField.compareFunction = ObjectUtil.dateCompare;
private function date_sortCompareFunc(itemA:Object, itemB:Object):int
{
/* Date.parse() returns an int, but
ObjectUtil.dateCompare() expects two
Date objects, so convert String to
int to Date. */
var dateA:Date = new Date(Date.parse(itemA));
var dateB:Date = new Date(Date.parse(itemB));
return ObjectUtil.dateCompare(dateA, dateB);
}
var sortField:SortField = new SortField("startDate");
sortField.compareFunction = date_sortCompareFunc;