8


2

複数の列に従ってフレックスデータグリッドをソートする方法

以下に示すようにデータグリッドがあります。 ユーザーが列見出しをクリックすると、選択された列が最初に使用される辞書式ソートを使用して行をソートし、次に残りの列が左から右の順に使用されて関係が切れます。 どうすればこれをコーディングできますか?

(私は一つの答えを持っています、私が以下に投稿しますが、それは問題を抱えています - 誰かがより良いものを提供できれば私はワクワクします!)

これがレイアウトです。


そして、これがバッキングコードです。

import mx.collections.ArrayCollection;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.DataGridEvent;

public function onCreationComplete():void
{
    var ar:ArrayCollection = new ArrayCollection();
    var ob:Object;
    for( var i:int=0; i<20; i++ )
    {
        ob = new Object();
        ob["A"] = i;
        ob["B"] = i%3;
        ob["C"] = i%5;
        ar.addItem(ob);
    }
    this.theGrid.dataProvider = ar;
}

1 Answer


12


これまでに見つけた最良の答えは、ユーザーがクリックしたときにheaderReleaseイベントをキャプチャすることです。


その後、イベントハンドラはデータにソート順を適用できます。

private var lastIndex:int = -1; private var desc:Boolean = false;

パブリック関数onHeaderRelease(evt:DataGridEvent):void {evt.preventDefault();}

var srt:Sort = new Sort(); varフィールド:Array = new Array();

if(evt.columnIndex == lastIndex){desc =!desc; } else {desc = false;} lastIndex = evt.columnIndex; }

fields.push(new SortField(evt.dataField、false、desc)); if(evt.dataField!= "A")fields.push(new SortField( "A"、false、desc)); if(evt.dataField!= "B")fields.push(new SortField( "B"、false、desc)); if(evt.dataField!= "C")fields.push(new SortField( "C"、false、desc)); srt.fields = fields;

var ar:ArrayCollection = this.theGrid.dataProvider as ArrayCollection; ar.sort = srt; ar.refresh(); }

しかし、この方法にはよく知られている問題があります。つまり、列ヘッダーにソート方向を示すための小さな矢印が表示されなくなるということです。 これはevt.preventDefault()を呼び出すことによる副作用ですが、その呼び出しを行わなければ、カスタムソートは適用されません。