2012-02-24 32 views
6

Desidero ordinare una raccolta di Array per fieldName come crescente. Ecco il mio codice e voglio sapere se è giusto. Hai qualche suggerimento?Come ordinare un ArrayCollection in Flex

public static function arrayCollectionSort(ar:ArrayCollection, fieldName:String, isNumeric:Boolean):void 
    {var dataSortField:SortField = new SortField(); 
     dataSortField.name = fieldName; 
     dataSortField.numeric = isNumeric; 
     var numericDataSort:Sort = new Sort(); 
     numericDataSort.fields = [dataSortField]; 
     arrCol.sort = numericDataSort; 
     arrCol.refresh();} 

risposta

16

Il codice che hai è corretto, tranne che per un tipo. arrCol dovrebbe essere ar. Il codice sembra quasi esattamente come il codice sul blog Flex Examples, che è anche corretto.

Basta cambiare è cambiare arrCol a ar come di seguito:

public static function arrayCollectionSort(ar:ArrayCollection, fieldName:String, isNumeric:Boolean):void 
{ 
    var dataSortField:SortField = new SortField(); 
    dataSortField.name = fieldName; 
    dataSortField.numeric = isNumeric; 
    var numericDataSort:Sort = new Sort(); 
    numericDataSort.fields = [dataSortField]; 
    ar.sort = numericDataSort; 
    ar.refresh(); 
} 

Non è sicuro con numerica ma per il resto tutto il resto è corretto.

3

Il tuo codice è a posto, anche se qui ci sono un paio di esempi in cui un tipo numerico e un ordine alfabetico vengono applicati ai clic del pulsante.

L'ordinamento alfabetico è un buon esempio di ordinamento su 2 attributi. In questo caso, l'ordinamento primario viene eseguito sul 'firstname', l'ordinamento secondario viene eseguito sul 'lastname'.

L'ordinamento numerico è piuttosto flessibile, se si fornisce un valore booleano di true per il parametro numerico del campo di ordinamento, l'ordinamento getterà l'attributo su un numero e ordinerà per numero. Se fornisci un valore booleano di false, viene utilizzata la funzione di confronto stringa incorporata. Ciascun elemento di dati viene eseguito il cast su una funzione String() prima del confronto. Con il valore predefinito di null, il primo elemento di dati viene introspettato per vedere se si tratta di un numero o una stringa e il tipo procede basato su tale introspezione.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="955" minHeight="600"> 

    <mx:Button label="Sort by first then last name" click="sortItemsByName()"/> 
    <mx:Button label="Sort by number" click="sortItemsByNumber()"/> 

    <mx:DataGrid dataProvider="{items}" 
       width="300" 
       height="300"> 
     <mx:columns> 
      <mx:DataGridColumn dataField="number"/> 
      <mx:DataGridColumn dataField="firstname"/> 
      <mx:DataGridColumn dataField="lastname"/> 
     </mx:columns> 
    </mx:DataGrid> 

    <mx:ArrayCollection id="items"> 
     <mx:Object number="3" firstname="John" lastname="Brown"/> 
     <mx:Object number="1" firstname="Kate" lastname="Brown"/> 
     <mx:Object number="4" firstname="Jeremy" lastname="Ryan"/> 
     <mx:Object number="5" firstname="Joe" lastname="Wilson"/> 
     <mx:Object number="2" firstname="Greg" lastname="Walling"/> 
    </mx:ArrayCollection> 

    <mx:Script> 
     <![CDATA[   
      import mx.collections.ArrayCollection; 
      import mx.collections.Sort; 
      import mx.collections.SortField; 

      /** 
      * Sort the arraycollection by the firstname and then the last name 
      * */ 
      private function sortItemsByName():void{ 
       var srt:Sort = new Sort(); 
       srt.fields = [new SortField("firstname"), new SortField("lastname")]; 
       items.sort = srt; 
       items.refresh(); 
      } 

      /** 
      * Sort the arraycollection numerically 
      * */ 
      private function sortItemsByNumber():void{ 
       var srt:Sort = new Sort(); 
       srt.fields = [new SortField("number", true, false, true)]; 
       items.sort = srt; 
       items.refresh(); 
      } 

     ]]> 
    </mx:Script> 
</mx:Application> 

qui è anche il riferimento lingua per il SortField ...

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/collections/SortField.html

... e Adobe LiveDocs di riferimento per i fornitori di dati e le collezioni ...

http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_2.html

... e questo è un buon riferimento a livedocs per l'ordinamento e il filtraggio ...

http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_4.html