1

我的 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 来显示数据。我的问题是保留多列排序。刷新发生后,用户选择的排序顺序消失,网格仅按第一列排序。所以假设,用户已经对表格进行了排序,首先按“年龄”升序,然后按“姓名”降序;刷新后,网格再次按“名称”升序排序。我不希望刷新事件改变排序顺序,只有数据应该被刷新。

提前致谢。

PS 我不能使用像 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>
4

3 回答 3

1

我遇到了同样的问题,根据 JtheGeek 和 Rocksoccer 的回答,我能够保留排序顺序。

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

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

它有效。XMLListCollection所以,我想知道在打电话之前对你做同样的事情是否gc.refresh()会产生相同的结果?IE:

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();
  }
于 2011-02-24T16:52:35.403 回答
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();
            }
于 2010-06-16T23:04:02.157 回答
0

我认为 JTtheGeek 的回答不太正确。当您对一列进行排序时,该代码才会起作用。因为除了降序,排序时还需要记住不同列之间的优先级。

其实就是这么简单,在dataProvider中创建一个临时排序对象来存储排序,然后在应用新的dataProver后恢复,然后刷新。

于 2010-11-30T17:58:10.140 回答