2008-09-17 9 views
8

У меня есть datagrid, заполненный, как показано ниже. Когда пользователь нажимает на заголовок столбца, я хотел бы сортировать строки, используя лексикографический вид, в котором первый столбец используется первым, а остальные столбцы используются в порядке слева направо, чтобы разорвать любые связи. Как я могу это кодировать?как отсортировать файл datagrid по нескольким столбцам?

(! У меня есть один ответ, который я выложу ниже, но есть проблема - я буду в восторге, если кто-то может обеспечить лучший друг)

Вот раскладка:

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

ответ

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() , однако вы должны сделать этот звонок, иначе ваш пользовательский сортировка не будет применяться.