AdvancedDataGrid Многоколоночная программная сортировка - PullRequest
0 голосов
/ 30 июля 2009

Мне нужна программная сортировка нескольких столбцов в AdvancedDataGrid. Проблема в том, что в настоящее время я использую пейджинг в своей сети. Таким образом, если я сортирую данные, сортируется только перкулярная страница. Итак, мне нужно отсортировать весь список по критериям столбца.

Я пробовал событие HeaderRelease, но, полагаю, оно бесполезно, поскольку мне нужно совершить двусторонний вызов на сервер для получения отсортированных данных. Есть ли способ, которым я могу это реализовать. Мне также нужно показать маркеры сортировки в правильном положении заголовков столбцов, указывая номера сортировки и направление.

буду очень признателен за помощь

Спасибо:)

Ответы [ 6 ]

1 голос
/ 21 августа 2009

Вам необходимо расширить 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(',');
}
0 голосов
/ 14 июля 2010

Попробуйте изменить приоритет события сортировки, нет необходимости переопределять обработчик сортировки, но это невозможно сделать в mxml.


protected function dataGrid_initializeHandler(event:FlexEvent):void {
    dataGrid.addEventListener(AdvancedDataGridEvent.SORT, dataGrid_sortHandler, false, -50);
}

protected function dataGrid_sortHandler(event:FlexEvent):void {
    dataGrid.dataProvider.sort; // now up to date!
}


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

0 голосов
/ 01 февраля 2010

Вы также можете взглянуть на класс AdvancedDataGridSortItemRenderer. Это помогает настроить средство сортировки элементов.

0 голосов
/ 08 сентября 2009

Извините, ребята! Пропустил начальную часть кода .... Вот правильный код

<: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>
0 голосов
/ 08 сентября 2009

Создайте свой собственный Advance Datagrid, как показано в примере ниже. У вас есть массив отсортированных столбцов и порядок. Отправьте событие cutom и передайте ему этот массив. Серверная служба выполнит соответствующий запрос и вернет вам результат.

        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>

0 голосов
/ 30 июля 2009

Если ваши данные разбиты на страницы, вам все равно придется пойти на сервер, чтобы получить данные. Если на стороне клиента хранится только часть данных, может быть лучше просто выполнить сортировку на сервере, поскольку только данные будут храниться на сервере.

...