1

XML オブジェクトには、姓、名、年齢の 3 つの属性があります。私のサンプル 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()と同じ結果になるのだろうか?すなわち:

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 の回答は正しくないと思います。コードは、1 つの列で並べ替えると機能します。降順を除いて、ソート時の異なる列間の優先順位も覚えておく必要があるためです。

実際、一時的な並べ替えオブジェクトを作成して並べ替えを dataProvider に格納し、新しい dataProver を適用した後にそれを復元してから更新するのはとても簡単です。

于 2010-11-30T17:58:10.140 に答える