2008-09-17 7 views
8

Ich habe ein Datagrid, wie unten gezeigt. Wenn der Benutzer auf eine Spaltenüberschrift klickt, möchte ich die Zeilen mit einer lexikographischen Sortierung sortieren, in der die ausgewählte Spalte zuerst verwendet wird. Anschließend werden die verbleibenden Spalten in der Reihenfolge von links nach rechts verwendet, um alle Verknüpfungen aufzuheben. Wie kann ich das programmieren?Wie wird ein Flex-Datagrid nach mehreren Spalten sortiert?

(! Ich habe eine Antwort, die ich weiter unten schreiben werde, aber es hat ein Problem - ich begeistert sein werde, 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; 
} 

Antwort

12

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

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

können die Event-Handler 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 nicht mehr ist, dass die Spaltenüberschriften kleine Pfeile zeigen die Art zu zeigen, Richtung. Dies ist ein Nebeneffekt des Aufrufs evt.preventDefault() jedoch müssen Sie diesen Aufruf vornehmen, sonst wird Ihre benutzerdefinierte Sortierung nicht angewendet.