我的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>
答案 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后恢复它,然后刷新它。