如何在 AS3 中对 datagrid 列进行排序?
Posted
技术标签:
【中文标题】如何在 AS3 中对 datagrid 列进行排序?【英文标题】:How do I order datagrid columns in AS3? 【发布时间】:2011-05-13 11:41:08 【问题描述】:我正在使用以下代码将 XML 直接加载到数据网格中:
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 属性的 columns 属性进行排序,但仍然能够更改标题文本,例如将标题大写或完全更改它们(“电话”可能变为“电话号码:”),您可以通过在将列分配给数据网格对象之前创建一个新的 DataGridColumn 并更改其 headerText 属性来做到这一点:DataGridColumn headerText property。
当您对 XML 数据没有管理控制权并且不想将 XML 传输到可以提供您的 dataProvider 的对象数组中时,这尤其有用。
【讨论】:
实际上,我正在使用上述代码将 XML 文件直接加载到 DataGrid 中。我希望列以与 xml 属性出现的顺序相同的顺序出现,但它似乎扰乱了顺序。我不知道它使用的顺序是什么,但每次都是一致的,但不是我想要的。 实际上,我通过先手动添加所有列来做同样的事情。你的解决方案更好。【参考方案2】:好的,下面是如何以编程方式按多列第一、第二、第三列对 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;
【讨论】:
以上是关于如何在 AS3 中对 datagrid 列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 在AS3中对多维数组进行排序(数字)
如何以编程方式对 Material UI DataGrid 列进行排序?