Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 如何根据多列对flex datagrid进行排序?_Apache Flex_Actionscript 3_Datagrid - Fatal编程技术网

Apache flex 如何根据多列对flex datagrid进行排序?

Apache flex 如何根据多列对flex datagrid进行排序?,apache-flex,actionscript-3,datagrid,Apache Flex,Actionscript 3,Datagrid,我有一个datagrid,如下所示填充。当用户单击列标题时,我希望使用字典排序对行进行排序,首先使用选定的列,然后按从左到右的顺序使用其余的列以打破任何联系。我如何编写代码 (我有一个答案,我将在下面发布,但它有一个问题——如果有人能提供更好的答案,我会非常激动!) 布局如下: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

我有一个datagrid,如下所示填充。当用户单击列标题时,我希望使用字典排序对行进行排序,首先使用选定的列,然后按从左到右的顺序使用其余的列以打破任何联系。我如何编写代码

(我有一个答案,我将在下面发布,但它有一个问题——如果有人能提供更好的答案,我会非常激动!)

布局如下:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="onCreationComplete()">

    <mx:Script source="GridCode.as" />

    <mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317">
        <mx:columns>
            <mx:DataGridColumn dataField="A"/>
            <mx:DataGridColumn dataField="B"/>
            <mx:DataGridColumn dataField="C"/>
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

以下是支持代码:

import mx.collections.ArrayCollection;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.DataGridEvent;

public function onCreationComplete():void
{
    var ar:ArrayCollection = new ArrayCollection();
    var ob:Object;
    for( var i:int=0; i<20; i++ )
    {
        ob = new Object();
        ob["A"] = i;
        ob["B"] = i%3;
        ob["C"] = i%5;
        ar.addItem(ob);
    }
    this.theGrid.dataProvider = ar;
}
导入mx.collections.ArrayCollection;
导入mx.collections.Sort;
导入mx.collections.SortField;
导入mx.controls.dataGridClasses.DataGridColumn;
导入mx.events.DataGridEvent;
公共函数onCreationComplete():void
{
var ar:ArrayCollection=新的ArrayCollection();
var-ob:对象;

对于(var i:int=0;i到目前为止,我找到的最佳答案是在用户单击时捕获headerRelease事件:

<mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317"
        headerRelease="onHeaderRelease(event)">
然而,这种方法有一个众所周知的问题,即列标题不再显示小箭头来显示排序方向 evt.preventDefault() 但是,您必须进行该调用,否则您的自定义排序将无法应用

private var lastIndex:int = -1;
private var desc:Boolean = false;

public function onHeaderRelease(evt:DataGridEvent):void
{
    evt.preventDefault();

    var srt:Sort = new Sort();
    var fields:Array = new Array();

    if( evt.columnIndex == lastIndex )
    {
        desc = !desc;
    }
    else
    {
        desc = false;
        lastIndex = evt.columnIndex;
    }

    fields.push( new SortField( evt.dataField, false, desc ) );
    if( evt.dataField != "A" )
        fields.push( new SortField("A", false, desc) );
    if( evt.dataField != "B" )
        fields.push( new SortField("B", false, desc) );
    if( evt.dataField != "C" )
        fields.push( new SortField("C", false, desc) );
    srt.fields = fields;

    var ar:ArrayCollection = this.theGrid.dataProvider as ArrayCollection;
    ar.sort = srt;
    ar.refresh();
}