0

AdvancedDataGridでプログラムによる複数列の並べ替えを行う必要があります。問題は、現在、グリッドにページングを実装していることです。したがって、データを並べ替えると、特定のページのみが並べ替えられます。したがって、リスト全体を列の基準で並べ替える必要があります。

HeaderReleaseイベントを試しましたが、並べ替えられたデータを取得するためにサーバーへのラウンドトリップ呼び出しを行う必要があるため、役に立たないと思います。それを実装する方法はありますか?また、列ヘッダーの正しい位置に並べ替えマーカーを表示して、並べ替え番号と方向を示す必要があります。

本当に助けてくれてありがとう

ありがとう :)

4

6 に答える 6

1

AdvancedDataGridを拡張し、sortHandlerをオーバーライドする必要があります

public var orderBy:String; 
override protected function sortHandler(event:AdvancedDataGridEvent):void {
     super.sortHandler(event); 
     var arry:Array = [];  
     for each(var o:SortField in collection.sort.fields){
         arry.push(o.name+' '+(o.descending?'DESC':'ASC'));     
     }
     orderBy = arry.join(',');
}
于 2009-08-20T20:29:51.463 に答える
0

クラスもご覧いただけますAdvancedDataGridSortItemRenderer。これは、ソートアイテムレンダラーをカスタマイズするのに役立ちます。

于 2010-02-01T16:55:44.880 に答える
0

データがページングされている場合は、とにかくデータを取得するためにサーバーにアクセスする必要があります。データの一部のみがクライアント側に保存されている場合は、サーバーのみがすべてのデータを保持するため、サーバー上で並べ替える方がよい場合があります。

于 2009-07-30T15:29:46.247 に答える
0

以下の例に示すように、独自のカスタムAdvanceDatagridを作成します。並べ替えられた列の配列と順序があります。cutomイベントを送信し、この配列を渡します。サーバー側のTechはそれに応じてクエリを実行し、結果を返します。

        import mx.events.CollectionEvent;
        import mx.binding.utils.BindingUtils;
        import mx.collections.SortField;
        import mx.collections.Sort;
        import mx.collections.ArrayCollection;
        import mx.events.AdvancedDataGridEvent;

        private var sortOrder:Boolean = true;
        [Bindable]
        public var headerHt:int = 30;


        [Inspectable(defaultValue="true", type="Boolean", enumeration="true,false", inherit="yes")]
        [Bindable]
        public var allowHeaderWordWrap:Boolean = true;

        public function sortCaseInsensitive(event:AdvancedDataGridEvent):void{
            var genericDataProvider:Object  = this.dataProvider as Object;
            sortOrder = !sortOrder; 
            //genericDataProvider.sort = new Sort();
            if(genericDataProvider.sort == null){
                genericDataProvider.sort = new Sort();
            } 
            var sortField:SortField = new SortField(event.dataField,true,sortOrder);
            switch (event.dataField) {
                  case "assmtId":
                      sortField.numeric = true;
                break;

            }//switch

            //genericDataProvider.sort.fields = [sortField];
            if(genericDataProvider.sort.fields == null){
                genericDataProvider.sort.fields = [sortField];
            }else{
                //if dataField is not already present in sort fields array 
                if(genericDataProvider.sort.fields.indexOf(sortField) != -1){
                    genericDataProvider.sort.fields = genericDataProvider.sort.fields.concat(sortField);
                }
             }
            genericDataProvider.refresh();

                 // Send custom event to server and pass the array of sort to it the server side technology will make dynamic query and return the result
        }//sortCaseInsensitive

    ]]>
</mx:Script>

于 2009-09-08T07:26:52.783 に答える
0

すみませんみんな!コードの最初の部分を見逃しました...これが正しいコードです

<:AdvancedDataGrid headerWordWrap="{allowHeaderWordWrap}"   headerRelease="sortCaseInsensitive(event)" headerHeight="{headerHt}">

    <:Script>
        <[CDATA[
            import mx.events.CollectionEvent;
                import mx.binding.utils.BindingUtils;
                import mx.collections.SortField;
                import mx.collections.Sort;
                import mx.collections.ArrayCollection;
                import mx.events.AdvancedDataGridEvent;

                private var sortOrder:Boolean = true;
                [Bindable]
                public var headerHt:int = 30;


                [Inspectable(defaultValue="true", type="Boolean", enumeration="true,false", inherit="yes")]
                [Bindable]
                public var allowHeaderWordWrap:Boolean = true;

                public function sortCaseInsensitive(event:AdvancedDataGridEvent):void{
                var genericDataProvider:Object  = this.dataProvider as Object;
                        sortOrder = !sortOrder; 
                        //genericDataProvider.sort = new Sort();
                        if(genericDataProvider.sort == null){
                                genericDataProvider.sort = new Sort();
                        } 
                        var sortField:SortField = new SortField(event.dataField,true,sortOrder);
                switch (event.dataField) {
                      case "assmtId":
                      sortField.numeric = true;
                break;

                }//switch

                //genericDataProvider.sort.fields = [sortField];
                if(genericDataProvider.sort.fields == null){
                        genericDataProvider.sort.fields = [sortField];
                }else{
                        //if dataField is not already present in sort fields array 
                        if(genericDataProvider.sort.fields.indexOf(sortField) != -1){
                                genericDataProvider.sort.fields = genericDataProvider.sort.fields.concat(sortField);
                        }
                 }
            genericDataProvider.refresh();

                 // Send custom event to server and pass the array of sort to it the server side technology will make dynamic query and return the result
                }//sortCaseInsensitive

        ]]>
<:Script>
<:AdvancedDataGrid>
于 2009-09-08T07:37:43.497 に答える
0

ソートイベントのイベント優先度を変更してみてください。ソートハンドラーをオーバーライドする必要はありませんが、mxmlでは実行できません。

保護された関数dataGrid_initializeHandler(event:FlexEvent):void {
    dataGrid.addEventListener(AdvancedDataGridEvent.SORT、dataGrid_sortHandler、false、-50);
}

保護された関数dataGrid_sortHandler(event:FlexEvent):void {
    dataGrid.dataProvider.sort; //最新になりました!
}


<mx:AdvancedDataGrid id = "dataGrid" initialize = "dataGrid_initializeHandler(event)" dataProvider = "{model.dataProvider}" />

于 2010-07-14T15:02:31.420 に答える