如何在 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 列进行排序?

如何在角度 4 材料排序中对日期/时间列进行排序?

如何在 Perl 6 中对散列进行排序

如何在 SQL Server 中按日期列排序的组中对列进行排名

如何在sequelize中对嵌套模型中的列进行排序?