Frage

Ich habe ein Datagrid, bevölkert wie unten gezeigt. Wenn der Benutzer auf einem Spaltenkopf klickt, würde Ich mag die Zeilen, in denen mit einer lexicographic Art sortieren die ausgewählten Spalt zuerst verwendet werden, dann werden die verbleibenden Spalten in von links nach rechts, um etwaigen Verbindungen zu brechen verwendet. Wie kann ich Code das?

(Ich habe eine Antwort, die ich unten posten, aber es hat ein Problem - ich werde freuen, wenn jemand ein besseres zur Verfügung stellen kann)

Hier ist das Layout:

<?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>

Und hier ist der Träger Code:

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;
}
War es hilfreich?

Lösung

Die beste Antwort, die ich bisher gefunden habe, ist das Ereignis header, wenn der Benutzer klickt zu erfassen:

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

Der Event-Handler kann dann eine Sortierreihenfolge auf die Daten anwenden:

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

Allerdings hat dieser Ansatz ein bekanntes Problem, das ist, dass die Spaltenüberschriften nicht mehr kleine Pfeile zeigen die Sortierrichtung zu zeigen. Dies ist ein Nebeneffekt des Aufrufs     evt.preventDefault () jedoch müssen Sie diesen Anruf oder auch Ihre benutzerdefinierte Sortierung nicht angewandt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top