分层收集视图:一次排序?

时间:2011-05-16 01:20:54

标签: flex sorting actionscript hierarchical-data advanceddatagrid

我有一个依赖于HierarchicalCollectionView的AdvancedDataGrid,因为它是dataProvider。我想要做的是在数据首次加载时对数据进行排序,然后禁用排序,以便在初始加载后添加的任何内容都不会导致网格再次自动排序。我试过这样的事情:

this._myDataProvider = new HierarchicalCollectionView(
                           new HierarchicalData(this._model.rootTasks));

var mySort:Sort = new Sort();                   
mySort.fields = [new SortField("startDate")];

this._tasksDataProvider.sort = taskSorting;
this._tasksDataProvider.refresh();
this._tasksDataProvider.sort = null;

但是将排序设置为null只会使数据未排序。我想我要问的是:如何对底层分层数据进行排序,因为设置sort属性会使其保持动态排序。感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

就个人而言,我会在您获取数据时更改排序顺序。它可以在服务器端完成,也可以在解析数据时完成(即在模型中)。您可以使用带sortOn的数组进行一次排序。

答案 1 :(得分:0)

你可以 1.使用排序功能对原始数据进行排序, 2.克隆内容并将其放入一个没有排序的新集合(小心做并手动克隆), 3.只需使用新的数据集。

答案 2 :(得分:0)

我遇到了同样的问题,直到我意识到使用Sort对象的排序不会改变Collection中项目的“物理”排序,因此当您删除Sort时,下一次刷新会将视图恢复为实际“物理”订购。 如上所述,我通过以下方式将子集合克隆为排序顺序来解决它:

    public static function buildPositionSort():Sort
    {
        var dataSortField:SortField = new SortField();
        dataSortField.name = "position";
        dataSortField.numeric = true;
        dataSortField.descending = false;
        var sort:Sort = new Sort();
        sort.fields = [ dataSortField ];
        return sort;
    }
    /**
     * This method is used to create a clone of ArrayCollection, because sorting does not
     * actually change the physical ordering of the items.
     */
    public static function createSortedArrayCollectionCopy(source:ArrayCollection):ArrayCollection
    {
        var target:ArrayCollection = new ArrayCollection();
        source.sort = buildPositionSort();
        source.refresh();
        for each (var item:Object in source)
        {
            if (item.children != null) item.children = createSortedArrayCollectionCopy(item.children);
            target.addItem(item);
        }
        return target;
    }