2010-11-21 60 views
1

我使用下面的代碼XML直接加載到一個DataGrid:基於標題如何訂購AS3中的datagrid列?

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")); 

我怎樣才能重新排序列?

編輯:

我的XML看起來是這樣的:

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

我想要的列出現在屬性的順序(如第一個,最後,地址,城市,州,郵政編碼,電話),但他們不是。

EDIT2:

TheDarklnl有正確的答案。我實現它稍有不同:

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

回答

1

您可以使用與Array對象相同的方式對DataProvider對象進行排序。所以如果你的列標題命名爲「columnTitles」:

dp.sortOn("columnTitles"); 

此外,還可以額外的排序方法與陣列公共常量提供第二參數。

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

所以,如果你想你的columnTitles被數字順序排序,以及作爲不區分大小寫:

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

更新

你可以通過設置他們的標題爲了您的列用於數據網格對象的columns屬性的字符串數組中。所以如果你想在同一順序的列,因爲它們是在XML文件中:

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

更新2

如果您想使用基於XML列屬性進行排序屬性,但仍然能夠更改標題文本,例如大寫標題或完全更改它們(「電話」可能會變成「電話號碼:」),您可以通過創建一個新的DataGridColumn並更改它的headerText屬性,然後分配列到您的數據網格對象:DataGridColumn headerText property

當您沒有對XML數據的管理控制並且不希望將XML轉換爲可提供dataProvider的對象數組時,此功能特別有用。

+0

其實,我用上面的代碼中直接加載XML文件到一個DataGrid。我希望列出現的順序與xml屬性出現的順序相同,但它似乎在擾亂順序。我不知道它使用的順序是什麼,但每次都是一致的,但不是我想要的。 – Moshe 2010-11-22 00:50:31

+0

啊..我明白你的意思了。我已經更新了我的答案。 – TheDarkIn1978 2010-11-22 01:26:06

+0

實際上,我通過首先手動添加所有列來做同樣的事情。你的解決方案更好。 – Moshe 2010-11-22 01:40:43

1

好吧,這裏是如何編程第一排序多個列DataGrid中,第二個,第三個......

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