如何订购AS3中的datagrid列?

如何订购AS3中的datagrid列?

问题描述:

我使用下面的代码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; 
} 

您可以使用与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

好吧,这里是如何编程第一排序多个列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; 
      } 
     } 
    } 
}