【问题标题】:How do I order datagrid columns in AS3?如何在 AS3 中对 datagrid 列进行排序?
【发布时间】: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;
}

【问题讨论】:

    标签: xml actionscript-3 datagrid


    【解决方案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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2013-01-26
      • 2014-12-12
      • 2010-12-10
      • 1970-01-01
      • 2012-08-12
      相关资源
      最近更新 更多