如何订购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的对象数组时,此功能特别有用。
答
好吧,这里是如何编程第一排序多个列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;
}
}
}
}
其实,我用上面的代码中直接加载XML文件到一个DataGrid。我希望列出现的顺序与xml属性出现的顺序相同,但它似乎在扰乱顺序。我不知道它使用的顺序是什么,但每次都是一致的,但不是我想要的。 – Moshe 2010-11-22 00:50:31
啊..我明白你的意思了。我已经更新了我的答案。 – TheDarkIn1978 2010-11-22 01:26:06
实际上,我通过首先手动添加所有列来做同样的事情。你的解决方案更好。 – Moshe 2010-11-22 01:40:43