代码之家  ›  专栏  ›  技术社区  ›  Eric

如何根据多列对flex数据报进行排序?

  •  8
  • Eric  · 技术社区  · 16 年前

    我有一个数据报,如下图所示填充。当用户单击列标题时,我想使用词典排序法对行进行排序,首先使用所选列,然后按从左到右的顺序使用其余列来断开任何关系。我如何编码?

    (我有一个答案,我将在下面发布,但有一个问题——如果有人能提供更好的答案,我会很高兴的!)

    布局如下:

    <?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;
    }
    
    1 回复  |  直到 16 年前
        1
  •  12
  •   Eric    16 年前

    到目前为止,我找到的最佳答案是在用户单击时捕获HeaderRelease事件:

    <mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317"
            headerRelease="onHeaderRelease(event)">
    

    然后,事件处理程序可以对数据应用排序顺序:

    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();
    }
    

    然而,这种方法有一个众所周知的问题,即列标题不再显示小箭头来显示排序方向。这是打电话的副作用 evt.preventDefault()。 但是,必须进行该调用,否则将不会应用自定义排序。