Как отсортировать AdvancedDataGrid с иерархическими данными? - PullRequest
2 голосов
/ 29 марта 2011

У меня есть AdvancedDataGrid с HierarchicalCollectionView в качестве dataProvider. Когда я просматриваю сетку с набором данных, с которым я работаю, и щелкаю по заголовку столбца, по которому я хочу отсортировать, все работает отлично. Это сортирует это иерархически точно, как я ожидал бы.

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

Редактировать - Кстати, я пробовал это:

var myData:HierarchicalCollectionView = new HierarchicalCollectionView(theDataSource);

// Works fine using only the line above and clicking the header to sort.
// This is the part that I tried adding:
var sort:Sort = new Sort();

sort.fields = [new SortField("startDate")];

myData.sort = sort;
myData.refresh();

Похоже, что это делает что-то в отношении сортировки, но не сортирует ее так же, как щелчок заголовка столбца. Кстати, startDate - это свойство объекта в theDataSource.

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Похоже, вы хотите отсортировать даты. Sort не может сделать это из коробки. Вы должны использовать compareFunction.

Если ваши объекты имеют тип Date, это довольно просто:

var sortField:SortField = new SortField("startDate");
sortField.compareFunction = ObjectUtil.dateCompare;

В случае, если ваш столбец содержит даты в виде строк, вам придется сначала их проанализировать (пример кода из http://blog.flexexamples.com/2007/08/12/sorting-date-columns-in-a-datagrid/):

private function date_sortCompareFunc(itemA:Object, itemB:Object):int
{
    /* Date.parse() returns an int, but
       ObjectUtil.dateCompare() expects two
       Date objects, so convert String to
       int to Date. */
    var dateA:Date = new Date(Date.parse(itemA));
    var dateB:Date = new Date(Date.parse(itemB));
    return ObjectUtil.dateCompare(dateA, dateB);
}

var sortField:SortField = new SortField("startDate");
sortField.compareFunction = date_sortCompareFunc;

Тогда просто используйте sortField, как вы делали в своем примере. Это должно работать нормально.

1 голос
/ 29 марта 2011

Вы можете создать новое расширенное событие сортировки сетки данных и отправить его в сетку после того, как для него заданы иерархические данные (к сожалению, мне пришлось использовать callLater, чтобы дать сетке время для внутренней обработки коллекции, кажетсяназначения для dataProvider в ADG иногда бывают асинхронными)

        var advancedDataGridEvent : AdvancedDataGridEvent = new AdvancedDataGridEvent(AdvancedDataGridEvent.SORT, false, true);

        advancedDataGridEvent.columnIndex = columnIndex;
        advancedDataGridEvent.dataField = dataField;

        dispatchEvent(advancedDataGridEvent);

Этот код относится к расширению ADG, поэтому вы бы хотели, чтобы dispatchEvent действительно находился в вашем экземпляре сетки, если вы не создаетерасширение.

Также примечание из кода:

            //setting sortDescending=true on a column does not work as expected.  so, until a solution
            //is found, this works just as well.  the event that is dispatch just tells the column
            //to reset.  so, one resorts ascending (the default), while a second resorts descending.
            //however, this second is only dispatched if defaultSortDesc is true on the grid.
            if (defaultSortDesc)
            {
                dispatchEvent(advancedDataGridEvent);
            }

Отправляет событие дважды, чтобы перевернуть сортировку.

...