2008-09-17 26 views
8

Mam datagrid, wypełnione, jak pokazano poniżej. Kiedy użytkownik kliknie nagłówek kolumny, chciałbym posortować wiersze za pomocą sortowania leksykograficznego, w którym wybrana kolumna zostanie użyta jako pierwsza, a pozostałe kolumny będą używane w kolejności od lewej do prawej w celu rozbicia wszelkich powiązań. Jak mogę to zakodować?jak sortować datagrid flex zgodnie z wieloma kolumnami?

(! Mam jedną odpowiedź, która wyślę poniżej, ale ma problem - Będę zachwycony, jeśli ktoś może zapewnić lepszy)

Oto układ:

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

A oto kod podkład:

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

Odpowiedz

12

najlepsza odpowiedź znalazłem tak daleko jest do przechwytywania zdarzenie headerRelease gdy użytkownik kliknie:

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

obsługi zdarzeń można następnie zastosować porządek do danych:

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

Jednak takie podejście ma dobrze znany problem, który jest, że nagłówki kolumn nie są już wyświetlane małe strzałki pokazują rodzaj kierunek. Jest to efekt uboczny wywoływania evt.preventDefault() , ale musisz wykonać to połączenie, bo inaczej sortowanie niestandardowe nie zostanie zastosowane.

Powiązane problemy