1

Flex で利用可能な並べ替え機能は、すべてのデータにアクセスできることを前提としていますが、ページ分割されたデータグリッド (カスタム コードを使用) を使用しています。データグリッドは ArrayCollection インスタンスにバインドされ、次のページ呼び出しでデータを変更します。データプロバイダーのすべてが正常に機能しますが、並べ替えのために、クリックまたはイベントをオーバーライドする必要があり、配列コレクションの並べ替えメソッドをオーバーライドする必要があります

これはすべて、サーバー側の並べ替えを実行できるようにするためです。

この種の問題に直面した人はいますか?

4

4 に答える 4

2

この問題を解決するために私が使用した手順は次のとおりです...このソリューションの良い点は、Flexが私と一緒に「ソート」できることです。これにより、ソート方向アイコンがDataGridに表示されたままになります。

手順:

  1. DataGrid の headerRelease イベントを使用して、「並べ替え」要求をインターセプトします。

  2. 列とその現在のソート方向のローカルマップを保持します...これはフレックスがそのソートで行っていることの模倣です...したがって、すべての列は「昇順」で始まり、指定された列の場合にのみ方向が切り替わります2 回続けてクリックされます。これはおそらく flex の内部構造を監視することで実行できますが、私はそれを試す気にはなりませんでした。

  3. headerRelease イベントは、そのイベントから要求された列を、以前に要求された列および現在の列の並べ替え方向のマップと共に使用して、ローカル マップで並べ替え方向を更新するかどうかを決定します。

  4. サーバーを呼び出して、適切にソートされたデータのページを取得します。

この時点で、Flex はデータも並べ替えたいと考えています... (Default() の headerRelease イベントを防止しない限り)... Flex が何も混乱させることなくデータを「並べ替える」ことができるようにし、方向アイコンが引き続き表示されるようにします。適切に機能する場合、次のことができます。

  1. サーバー上のSQL結果セットに「行ID」フィールドを追加します。これは、並べ替えとページングが行われた後、結果セットの各連続行の単なるカウンターです...このIDは、並べ替えに関係なく常に昇順になります方向が適用されます。

  2. DataGridColumns の sortCompareFunction を、この行 ID を使用する「ダミー」ソートに設定します。

public function doNothingSort( a:Object, b:Object ):int {
    if( weAreCurrentlyInAscendingDirection )
        return ObjectUtil.numericCompare( a.new, b.num );
    else
        return ObjectUtil.numericCompare( b.num, a.num );
}

これにより、フレックスが「ページ」を通過し、すべてをそのままにしておくことができます...アイコンがあるので、それは幸せであり、あなたは幸せです...

于 2010-04-27T19:15:42.657 に答える
0

質問を本当に理解しているかどうかはわかりませんが、サーバー側で並べ替えを行う必要があるようです。すべてのデータがフレックス アプリケーションにロードされていない場合、それを並べ替える方法はありません。

于 2010-02-22T16:58:27.740 に答える
0

私はこの問題を次のように理解しました:

彼はフレックス クライアントの全データの一部を持っています。クライアントはすべてのデータを把握しているわけではないため、クライアント側で並べ替えを行うことはできません。彼はすでにサーバー側の並べ替えを機能させています。

彼が今しなければならないことは: ユーザーがデータグリッドのヘッダーをクリックすると、サーバー呼び出しを行い、ソートされたデータを取得したいと考えています。グリッドのヘッダーがクリックされたときのデフォルトの動作は、データがクライアント側でソートされることです。そのため、彼はクライアント側で何かをする必要があります。

私が見つけた唯一のものはこれでした:

<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
headerRelease="onHeaderRelease(event)">

指定された関数 onHeaderRelease は、ヘッダーのマウス ボタンがクリックされるとすぐに呼び出されます (マウス ボタンが再び離されます)。

例の関数。ここから拾えるかも

        public function onHeaderRelease(evt:DataGridEvent):void
        {
            var grd:DataGrid = DataGrid(evt.currentTarget);
            Alert.show(evt.columnIndex + " : " + (DataGridColumn)(grd.columns[evt.columnIndex]).sortDescending, "ColumnIndex : Sorted Descending?");
            // do the server called and get the sorted array back
        }

これがお役に立てば幸いです!

于 2010-02-23T12:59:54.267 に答える
0

私は次の解決策を実装しました。現時点ではかなりうまく機能していますが、おそらく改善できる可能性があります。

ArrayCollection クラスを拡張し、sort set/get および refresh メソッドをオーバーライドしました

package custom
{
import mx.collections.ArrayCollection;
import mx.collections.Sort;

/**
 *  Dispatched when a sort is required
 *
 *  @eventType custom.PaginatedCollectionEvent.SORT
 */
[Event(name="sort" , type="custom.PaginatedCollectionEvent")]

public class PaginatedCollection extends ArrayCollection
{
    private var _sort:Sort;

    public function PaginatedCollection(source:Array=null)
    {
        super(source);
    }

    public function setDefaultSort (s:Sort):void
    {
        _sort = s;
    }


    override public function set sort(s:Sort):void
    {
        _sort = s;
        if (!s)
            return;

        var event:PaginatedCollectionEvent = new PaginatedCollectionEvent(PaginatedCollectionEvent.SORT);
        event.fields = s.fields;
        event.s = s;
        this.dispatchEvent(event);
    }

    override public function get sort():Sort
    {
        return _sort;
    }

    /**
     * Avoid the internal sorting implementation, with this it's possible
     * to do a server side sort.
     *
     * @return true
     */
    override public function refresh():Boolean
    {
        return true;
    }

    /**
     * Wrapper for ArrayCollection refesh implementation
     */
    public function superRefresh():Boolean
    {
        return super.refresh();
    }
}

}

于 2010-03-02T14:28:47.127 に答える