2010-11-21 12 views
1

Ich verwende den folgenden Code XML direkt in einem Datagrid zu laden:Wie bestelle ich DataGrid-Spalten in 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")); 

Wie kann ich meine Spalten neu anordnen auf den Titel basiert?

EDIT:

Meine XML wie folgt aussieht:

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

möchte ich die Spalten in der Reihenfolge der Attribute erscheinen (als erste, letzte, Adresse, Stadt, Bundesland, Postleitzahl , Telefon), aber sie sind nicht.

EDIT2:

TheDarklnl hat die richtige Antwort. Ich implementierte es jedoch etwas anders:

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

Antwort

1

Sie können das DataProvider-Objekt auf die gleiche Weise wie ein Array-Objekt sortieren. also, wenn Ihre Spaltentitel genannt werden „columnTitles“:

dp.sortOn("columnTitles"); 

zusätzlich können Sie einen zweiten Parameter für zusätzliche Sortierverfahren mit Array öffentlichen Konstanten liefern.

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

so, wenn man wollte Ihre columnTitles numerisch als auch sortiert werden Fall unempfindlich:

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

aktualisieren

Sie Ihre Spalten, indem ihre Titel bestellen in einem Array von Strings für die columns-Eigenschaft des Data-Grid-Objekts. so, wenn Sie Ihre Spalten in der gleichen Reihenfolge, wie sie in der XML-Datei sind:

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

Update 2

wenn Sie möchten, dass die Spalten Eigenschaft sortieren mit basierend auf dem XML Attribute, aber noch in der Lage sein, den Kopftext zu ändern, zum Beispiel des Titels Kapitalisierung oder ganz zu ändern („Telefon“ könnten „Telefonnummer:“ worden) ist, wird seine Eigenschaft Headertext ein neues Datagrid durch das Erstellen und ändern tun, damit die vor der Erteilung von Spalte zu Ihrem Datenrasterobjekt: DataGridColumn headerText property.

dies ist besonders nützlich, wenn Sie nicht die administrative Kontrolle über die XML-Daten haben Sie und wollen nicht die XML-Daten in ein Array von Objekten übertragen, die Ihre Datenprovider liefern könnten.

+0

Eigentlich bin ich Laden einer XML-Datei direkt in einem Datagrid den obigen Code verwenden. Ich möchte, dass die Spalten in der gleichen Reihenfolge angezeigt werden, in der die XML-Attribute angezeigt werden, aber sie scheint die Reihenfolge zu verwechseln.Ich weiß nicht, was die Reihenfolge ist, die es verwendet, aber es ist jedes Mal konsistent, aber nicht was ich will. – Moshe

+0

ah .. ich sehe was du meinst. Ich habe meine Antwort aktualisiert. – TheDarkIn1978

+0

Eigentlich tat ich das Gleiche, indem ich zuerst alle Spalten manuell hinzufügte. Deine Lösung ist besser. – Moshe

1

Okay, hier ist, wie programmatisch das Datagrid nach mehreren Spalten sortieren zuerst zu, zweiten, dritten ...

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