1


1

GroupingCollectionとしてdataProviderを使用してAdvancedDataGridで複数列の並べ替えを保持する

XMLオブジェクトには、姓、名、年齢の3つの属性があります。 私のサンプルXMLは次のようになります。


Grouping CollectionとAdvancedDataGridを使用してデータを表示しています。 私の問題は、複数列のソートを保持することです。 更新が行われると、ユーザーが選択した並べ替え順序がなくなり、グリッドは最初の列のみで並べ替えられます。 したがって、ユーザーがテーブルをソートし、最初に「年齢」で昇順で並べ替え、次に「名前」で降順で並べるとします。更新が発生すると、グリッドは再び「名前」で昇順にソートされます。 更新イベントで並べ替え順序を変更したくないので、データのみを更新する必要があります。

前もって感謝します。

P.S. ArrayCollectionのような他のデータ型を使用してデータを保存することはできません。

私のコードの一部は次のようになります。

 [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")));
 }

3 Answer


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


私もこれと同じ問題を抱えていましたが、JtheGeekとrocksoccerの回答に基づいて、ソート順を保持することができました。

私のセットアップは少し異なります。 AdvancedDataGrid.dataProvider`に直接バインドされている var _xmlListData:XMLListCollection`があります。 私のリフレッシュ機能は単にこれを行います:

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

そしてそれはうまくいきます。 それで、 `gc.refresh()`を呼び出す前に `XMLListCollection`に同じことをしても同じ結果になるのだろうか? イー。

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();
  }


0


私はJTtheGeekのanwserはまったく正しくないと思います。 コードは、1つの列で並べ替えるときに機能します。 降順を除いて、ソートの異なる列間の優先順位も覚えておく必要があるためです。

実際、データプロバイダーに並べ替えを格納する一時並べ替えオブジェクトを作成し、新しいdataProverを適用した後にそれを復元してから更新するのは非常に簡単です。