使用dataProvider作为GroupingCollection保留AdvancedDataGrid中的多列排序

时间:2009-12-11 09:18:52

标签: flex sorting grouping collections advanceddatagrid

我的XML对象中有三个属性:姓氏,名字和年龄。 我的示例XML看起来像:

<dataXML>
 <info last="Abc" first="Def" age="20"/>
 <info last="Abc" first="Hij" age="10"/>
 <info last="Xyz" first="Klm" age="25"/>
 <info last="Xyz" first="Opq" age="64"/>
 <info last="Xyz" first="Rst" age="08"/>
</dataXML>

我正在使用Grouping Collection和AdvancedDataGrid来显示数据。 我的问题是保留多列排序。 刷新发生后,用户选择的排序顺序消失,网格仅按第一列排序。 因此,假设用户已对表进行排序,首先按“年龄”递增,然后按“名称”递减;刷新后,网格再次按“名称”升序排序。 我不希望刷新事件更改排序顺序,只需要刷新数据。

提前致谢。

P.S。我不能使用像ArrayCollection这样的任何其他数据类型来存储数据。

我的部分代码如下:

<mx:Script>
<![CDATA[
 [Bindable]
 private var dataXML:XMLListCollection = new XMLListCollection();

 private function refresh(data:Object):void
 {
  dataXML.source = XML(data.result.value).info;
  gc.refresh();
  adGrid.dataProvider = gc;
  adGrid.validateNow();
  adGrid.dataProvider.refresh();
 }

 private function nameCompareFunction(a:XML, b:XML):int
 {
  return ObjectUtil.stringCompare(a.attribute("last") + a.attribute("first"), b.attribute("last") + b.attribute("first"));
 }

 private function valueSortCompareFunction(a:XML, b:XML):int
 {
  return ObjectUtil.numericCompare(Number(a.attribute("age")), Number(b.attribute("age")));
 }
]]>
</mx:Script> 

<Control:AdvancedDataGrid id="adGrid">
 <Control:dataProvider>
  <mx:GroupingCollection id="gc" source="{dataXML}">
   <mx:grouping>
    <mx:Grouping>
     <mx:GroupingField name="@last" compareFunction="nameCompareFunction"/>
    </mx:Grouping>
   </mx:grouping>
  </mx:GroupingCollection>
 </Control:dataProvider>   

 <Control:columns>
  <mx:AdvancedDataGridColumn id="ADGCName" dataField="@first" headerText="Name" wordWrap="true"/>
  <mx:AdvancedDataGridColumn id="ADGCAge" dataField="@age" headerText="Age" sortCompareFunction="valueSortCompareFunction"/>
 </Control:columns>
</Control:AdvancedDataGrid>

3 个答案:

答案 0 :(得分:1)

在刷新之前(或者当排序选项完全改变时)存储当前的排序选项,它们实际上在数据提供者上。 var objDp:HierarchicalCollectionView = ucADG.dataProvider as HierarchicalCollectionView;

在这种情况下,当前的SortField对象位于objDp.sort.fields上。

收集完成后,只需执行相反的操作即可。例如:

var objDP:HierarchicalCollectionView = ucADG.dataProvider as HierarchicalCollectionView;
            if(objDP != null)
            {
                var objSort:Sort = new Sort();
                objSort.fields = [ new SortField("SomeField", true, bUseDescending) ];
                objDP.sort = objSort;
                objDP.refresh();
            }

答案 1 :(得分:1)

我有同样的问题,基于JtheGeek和rocksoccer的答案,我能够保留排序顺序。

我的设置有点不同。我有var _xmlListData:XMLListCollection直接绑定到AdvancedDataGrid.dataProvider。我的刷新功能只是这样做:

var sort:Sort = _xmlListData.sort;
_xmlListData.source = data as XMLList;
_xmlListData.sort = sort;

它有效。所以,我想知道在调用XMLListCollection之前对你的gc.refresh()做同样的事情会有相同的结果吗?即:

private function refresh(data:Object):void
  {
    var sort:Sort = dataXML.sort;
    dataXML.source = XML(data.result.value).info;
    dataXML.sort = sort;
    gc.refresh();
    adGrid.dataProvider = gc;
    adGrid.validateNow();
    adGrid.dataProvider.refresh();
  }

答案 2 :(得分:0)

我认为JTtheGeek的anwser不太正确。当您对一列进行排序时,代码将正常工作。因为除了降序,你还需要记住排序中不同列之间的优先级。

实际上,它很容易,创建一个临时排序对象来存储dataProvider中的排序,然后在应用新的dataProver后恢复它,然后刷新它。