8

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

(以下に投稿する答えが1つありますが、問題があります-誰かがより良いものを提供できれば、私はわくわくします!)

レイアウトは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="onCreationComplete()">

    <mx:Script source="GridCode.as" />

    <mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317">
        <mx:columns>
            <mx:DataGridColumn dataField="A"/>
            <mx:DataGridColumn dataField="B"/>
            <mx:DataGridColumn dataField="C"/>
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

そして、ここにバッキングコードがあります:

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;
}
4

1 に答える 1

12

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

<mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317"
        headerRelease="onHeaderRelease(event)">

イベント ハンドラーは、データに並べ替え順序を適用できます。

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

public function onHeaderRelease(evt:DataGridEvent):void
{
    evt.preventDefault();

    var srt:Sort = new Sort();
    var fields: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() を呼び出すことの副作用ですが、その呼び出しを行う必要があります。そうしないと、カスタム ソートが適用されません。

于 2008-09-17T18:11:21.997 に答える