我有一个AdvancedDataGrid,其HierarchicalCollectionView作为其dataProvider。当我使用我正在使用的数据集查看网格,并单击我想要排序的列的标题时,一切都很完美。它按层次结构对其进行了精确排序。
我现在想要做的是在向用户显示网格时对其进行排序。有没有办法以编程方式执行此操作?我不能为我的生活弄清楚如何做到这一点,显然它是可能的,因为AdvancedDataGrid内置了这个。
编辑 - 顺便说一下,我试过这个:
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”是theDataSource
中对象的属性。
答案 0 :(得分:2)
您希望对日期进行排序。 Sort
无法开箱即用。您必须使用compareFunction
。
如果您的对象属于Date
类型,则非常简单:
var sortField:SortField = new SortField("startDate");
sortField.compareFunction = ObjectUtil.dateCompare;
如果您的列包含日期作为字符串,则必须先解析它们(代码示例来自http://blog.flexexamples.com/2007/08/12/sorting-date-columns-in-a-datagrid/):
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;
然后就像你在示例中所做的那样使用sortField
。这应该可以正常工作。
答案 1 :(得分:1)
您可以创建一个新的高级数据网格排序事件,并在其上设置分层数据后将其分配到网格上(不幸的是,我必须使用callLater为网格提供内部处理集合的时间。 ADG的dataProvider的赋值有时是异步的)
var advancedDataGridEvent : AdvancedDataGridEvent = new AdvancedDataGridEvent(AdvancedDataGridEvent.SORT, false, true);
advancedDataGridEvent.columnIndex = columnIndex;
advancedDataGridEvent.dataField = dataField;
dispatchEvent(advancedDataGridEvent);
此代码来自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);
}
它会调度事件两次以翻转排序。