2010-11-21 19 views
1

J'utilise le code suivant pour charger XML directement dans une grille de données:Comment commander des colonnes DataGrid dans AS3?

import flash.events.Event; 
import fl.data.DataProvider; 
import flash.net.URLRequest; 

var loader:URLLoader = new URLLoader(); 

loader.addEventListener(Event.COMPLETE, directoryXMLLoaded); 

function directoryXMLLoaded(e:Event){ 
    var dp:DataProvider = new DataProvider(new XML(e.target.data)); 
    directoryGrid.dataProvider = dp; 
} 

loader.load(new URLRequest("xml/directory.xml")); 

Comment puis-je réorganiser mes colonnes en fonction du titre?

EDIT:

Mon XML ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<contacts> 
<contact first="Moshe" last="Doe" address="555 5th St" city="Somwhere" state="AA" zip="555555" phone="555-555-5555" /> 
<contact first="Moshe" last="Doe" address="555 5th St" city="Somwhere" state="AA" zip="555555" phone="555-555-5555" /> 
<contact first="Moshe" last="Doe" address="555 5th St" city="Somwhere" state="AA" zip="555555" phone="555-555-5555" /> 
</contacts> 

Je veux que les colonnes apparaissent dans l'ordre des attributs (En tant que premier, dernier, adresse, ville, état, code postal , téléphone), mais ils ne le sont pas.

EDIT2:

TheDarklnl a la bonne réponse. Je l'ai implémenté légèrement différemment cependant:

function directoryXMLLoaded(e:Event){ 
    var dp:DataProvider = new DataProvider(new XML(e.target.data)); 
    directoryGrid.addColumn("first"); 
    directoryGrid.addColumn("last"); 
    directoryGrid.addColumn("address"); 
    directoryGrid.addColumn("city"); 
    directoryGrid.addColumn("state"); 
    directoryGrid.addColumn("zip"); 
    directoryGrid.addColumn("phone"); 
    directoryGrid.dataProvider = dp; 
} 

Répondre

1

Vous pouvez trier l'objet DataProvider de la même manière qu'un objet Array. donc si vos titres de colonnes sont nommés « columnTitles »:

dp.sortOn("columnTitles"); 

En outre, vous pouvez fournir un second paramètre pour les méthodes de tri supplémentaires avec Array constantes publiques.

Array.CASEINSENSITIVE 
Array.DESCENDING 
Array.NUMERIC 
Array.RETURNINDEXEDARRAY 
Array.UNIQUESORT 

donc si vous vouliez que votre columnTitles à trier numériquement tout en étant insensible à la casse:

dp.sortOn("columnTitles", ARRAY.CASEINSENSITIVE | ARRAY.NUMERIC) 

Mise à jour

vous pouvez commander vos colonnes en définissant leurs titres dans un tableau de chaînes pour la propriété columns de l'objet de grille de données. donc si vous voulez que vos colonnes dans le même ordre que sont dans votre fichier XML:

directoryGrid.columns = ["first", "last", "address", "city", "zip", "phone"]; 

Mise à jour 2

si vous souhaitez trier en utilisant la propriété de colonnes en fonction du XML attributs mais toujours être en mesure de modifier le texte d'en-tête, par exemple en capitalisant les titres ou en les changeant complètement ("téléphone" pourrait devenir "Numéro de téléphone:"), vous pouvez le faire en créant un nouveau DataGridColumn et en changeant sa propriété headerText avant d'affecter le colonne à votre objet de grille de données: DataGridColumn headerText property. Ceci est particulièrement utile lorsque vous n'avez pas de contrôle administratif sur les données XML et que vous ne souhaitez pas transférer le code XML dans un tableau d'objets pouvant alimenter votre fournisseur de données.

+0

En fait, je suis le chargement d'un fichier XML directement dans un DataGrid à l'aide du code ci-dessus. Je veux que les colonnes apparaissent dans le même ordre que les attributs xml, mais cela semble brouiller l'ordre.Je ne sais pas quel est l'ordre qu'il utilise, mais il est cohérent à chaque fois, mais pas ce que je veux. – Moshe

+0

ah .. je vois ce que tu veux dire. J'ai mis à jour ma réponse. – TheDarkIn1978

+0

En fait, j'ai fait la même chose en ajoutant manuellement toutes les colonnes en premier. Votre solution est meilleure. – Moshe

1

D'accord, voici comment trier le programme DataGrid en plusieurs colonnes première, deuxième, troisième ...

testBtn.addEventListener(MouseEvent.CLICK, testBtnClk); 
function testBtnClk(e:MouseEvent):void 
{ 
    dataGridMain.dataProvider.sort(sortOnCatDescCust); 
} 

function sortOnCatDescCust(a:Object, b:Object):Number { 
    var aCat:String = a.Category; 
    var aDesc:String = a.Description.toUpperCase(); 
    var aCust:String = a.Customer.toUpperCase(); 

    var bCat:String = b.Category; 
    var bDesc:String = b.Description.toUpperCase(); 
    var bCust:String = b.Customer.toUpperCase(); 

    if(aCat > bCat) 
    { 
      return 1; 
    } 
    if(aCat < bCat) 
    { 
      return -1; 
    } 
    else 
    { 
     if(aDesc > bDesc) 
     { 
      return 1; 
     } 
     if(aDesc < bDesc) 
     { 
      return -1; 
     } 
     else 
     { 
      if(aCust > bCust){ 
       return 1; 
      } 
      if(aCust < bCust){ 
       return -1; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
    } 
}