【问题标题】:HierarchicalCollectionView: One time sort?Hierarchical CollectionView:一次性排序?
【发布时间】:2011-08-26 03:02:15
【问题描述】:

我有一个 AdvancedDataGrid,它依赖于 HierarchicalCollectionView,因为它是 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 只会使数据未排序。我想我要问的是:如何对底层分层数据进行排序,因为设置排序属性似乎会使其保持动态排序。感谢您提供的任何帮助。

【问题讨论】:

    标签: apache-flex sorting actionscript hierarchical-data advanceddatagrid


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,直到我意识到使用 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;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-04
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多