AdvancedDataGrid Программная сортировка по нескольким столбцам

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

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

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

Спасибо :)


person online19    schedule 30.07.2009    source источник


Ответы (5)


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

person CookieOfFortune    schedule 30.07.2009
comment
да. Я понял. Но как мне продолжить сортировку на сервере при щелчке заголовка? Кроме того, мне также нужно обеспечить сортировку по нескольким столбцам. Наряду с этим мне нужно обновить область сортировки столбцов, указав номер порядка сортировки, а также направление сортировки. буду очень признателен за помощь в этом отношении. - person online19; 30.07.2009
comment
Я думаю, вам придется переопределить сортировку заголовков столбцов, поскольку она вообще не применяется в вашем случае, потому что вы всегда возвращаетесь на сервер. Если бы я делал это ... у меня, вероятно, был бы массив, который отслеживает столбцы, которые вы хотите отсортировать. Отправьте это на сервер для включения в запрос SQL или что-то еще, что вы используете, и сервер ответит правильным набором данных. - person CookieOfFortune; 30.07.2009
comment
Да, это то, на что я нацелен. Но сортировка динамическая. То есть, я не уверен, как отслеживать столбцы для сортировки, так как есть много возможностей. 1. Одинарная сортировка по любому из столбцов, 2. множественная сортировка по комбинации нескольких столбцов и т. Д. Итак, я не понимаю, где я могу это отследить. В событии выпуска заголовка или в событии сортировки? Пожалуйста помоги. Спасибо :) - person online19; 30.07.2009
comment
Я бы, вероятно, перехватил событие HeaderReleased, поскольку это происходит до сортировки. Затем я бы вызвал preventDefault (), чтобы остановить обычное действие сортировки. Как вы хотели реализовать сортировку по нескольким столбцам? Метод, о котором я думал, использовал стек (массив). Каждый раз, когда запрашивается столбец сортировки, помещайте это имя столбца в конец стека. Затем, когда вы вызываете свой сервер для сортировки, он сортирует данные, используя столбцы в стеке. Таким образом, первый выбранный столбец будет иметь наивысший приоритет, а последний - самый низкий. Нет, что preventDefault также предотвращает - person CookieOfFortune; 30.07.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(',');
}
person Community    schedule 20.08.2009
comment
Наконец, в вашем методе sortHandler dispatchEvent ('GOTOSERVERNOW') Обрабатывайте событие вне ADG и создайте свой запрос с помощью ADG.orderBy, а теперь получите новый набор записей. - person ; 21.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>
person Community    schedule 08.09.2009

Попробуйте изменить приоритет события сортировки, нет необходимости переопределять обработчик сортировки, но это невозможно сделать в 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}" />

person bas    schedule 14.07.2010

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

person Shameer Salim    schedule 01.02.2010