如何使用分层数据对AdvancedDataGrid进行排序?

时间:2011-03-29 17:02:06

标签: flex sorting actionscript hierarchical-data advanceddatagrid

我有一个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中对象的属性。

2 个答案:

答案 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);
            }

它会调度事件两次以翻转排序。