2010-11-17 5 views
0

У меня есть расширенный datagrid, и я реализую пользовательский сортировку. Моя сетка adv.data замедляется при каждой последующей сортировке ... и если узлы открыты, это просто отключается.Flex AdvancedDataGrid Задача пользовательской сортировки

Мои данные выглядит следующим образом (г = GRP на ID) *

ID f_name l_name fld1 fld2 
(g) 
-------------------------------------- 
1  A1  B1  xyx xyz 
     A6  B6  xyx xyz 
-------------------------------------- 
2  A3  B3  xyx xyz 
     A8  B8  xyx xyz 
-------------------------------------- 

Когда я сортирую на F_NAME или L_NAME сортировки ArrayCollection должны сортировать и отображать данные следующим образом (г = GRP на ID) * :

ID  f_name l_name fld1 fld2 
(g) 
----------------------------------------- 
1(1)  A1  B1  xyx xyz 
2(2)  A3  B3  xyx xyz 
----------------------------------------- 
1(3)  A6  B6  xyx xyz 
2(4)  A6  B6  xyx xyz 
----------------------------------------- 

Чтобы сделать это, я используя событие сортировки, который выглядит следующим образом

protected function adg1_headerReleaseHandler(event:AdvancedDataGridEvent):void 
{ 
event.preventDefault(); 

sort_dir = !sort_dir; 
var sort:Sort = new Sort(); 
sort.fields = [new SortField(event.dataField, true,sort_dir),new SortField('ID', true,sort_dir)] 
_ds.sort = sort; 
_ds.refresh(); 

adg1.dataProvider = null; 
var previousRegId:int = 0; 
var counter:int = 0; 

for each (var item:DueInVO in _ds) { 
    if (previousRegId != item.ID) { 
    counter++; 
    previousRegId = item.ID 
    } 
    item.uid = counter; 
} 

/* 
var previousRegId:int = 0; 
var counter:int = 0; 
var csr:IViewCursor = DataSource.createCursor(); 
while(!csr.afterLast){ 
    if (previousRegId != csr.current.registration_id) { 
    counter++; 
    previousRegId = csr.current.registration_id 
    } 

    csr.current.uid = counter; 
    csr.moveNext(); 
} 
*/ 
setGrouping(['uid']); 
//csr = null; 
} 

и функция setGrouping выглядит следующим образом:

protected function setGrouping(columnNames:Array):void{ 
var _groupingColumns:Array = []; 
var gc:GroupingField; 
if (columnNames.length > 0) { 
    var _groupedData:GroupingCollection2 = new GroupingCollection2(); 
    var _grouping:Grouping = new Grouping(); 

    for (var i:int=0;i<columnNames.length;i++) { 
    gc = new GroupingField(columnNames[i]); 
    //gc.numeric = true; 
    //gc.compareFunction = compareFunc; 
    //gc.groupingFunction = groupFunc; 
    _groupingColumns.push(gc); 

    } 
    _groupedData.source = _ds; 
    _grouping.fields = _groupingColumns; 
    _groupedData.grouping = _grouping 
    _groupedData.refresh(); 
    adg1.dataProvider = _groupedData; 
} else { 
    adg1.dataProvider = _ds; 
} 
} 

Однако каждая последующая просьба разобраться занимает больше времени и больше времени, чтобы решить. Как указано выше, если удалены узлы группировки, то существует высокая вероятность того, что Flash Player выйдет из строя.

Я предполагаю, что где-то есть mem-leak, но я не могу нанести на него палец.

Если кто-то требует полного кода, я буду рад предоставить ему ..

Вся помощь очень ценится

ответ

0

Вместо того, чтобы делать это, вы должны просто предоставить sortCompareFunction в столбце ADG. Вам не нужно записывать событие щелчка заголовка и все такое. Это уже сделано для вас. Все, что вам нужно сделать, это указать, как будет выглядеть ваше сравнение для определенного столбца.

+0

Функция обратного вызова, которая вызывается при сортировке данных в столбце. Если это свойство не указано, сортировка пытается использовать базовую строку или сортировку по номерам данных. Если данные не являются строкой или номером или если свойство dataField не является допустимым свойством поставщика данных, сортировка не работает или генерирует исключение.Если вы укажете значение свойства labelFunction, вы также должны предоставить функцию свойству sortCompareFunction, если сортировка в этом столбце не разрешена. – user478727

+0

Функция sortCompareFunction принимает в качестве аргументов два объекта. Эти объекты могут быть любыми, и ваш код для этой функции должен определять, какое свойство объекта сравнивать и как его сравнивать. Данные, безусловно, не должны быть строкой или числом. – Robusto

0

Я получил это! ... Робусто благодарит меня за то, что указал на меня в правильном направлении. Проблема с вашим предложением в моем случае заключается в том, что я генерирую столбцы из файла конфигурации, поэтому я могу сделать этот компонент сетки повторно используемым. Поэтому из-за этого: 1. Я использую labelFunction 2. column.sortCompareFunction = обратный вызов myfunc просто не работает, как указано в документации Adobe API.

Однако, как вы уже сказали, я писал сложный код. Мне нужно было добавить gc.compareFunction = myCompare; к следующему коду (см. выше):

защищенная функция setGrouping (columnNames: Array): void { _groupingColumns = [];

  if (columnNames.length > 0) { 
       _groupedData = new GroupingCollection2(); 

       _grouping = new Grouping(); 

       for (var i:int=0;i<columnNames.length;i++) { 
        var gc:GroupingField = new GroupingField(columnNames[i]); 
        gc.descending = _sort_direction; 

        gc.compareFunction = myCompare; 

        _groupingColumns.push(gc); 

       } 
       _groupedData.source = _ds; 
       _grouping.fields = _groupingColumns; 
       _groupedData.grouping = _grouping 
       _groupedData.refresh(); 
       _data = _groupedData; 
      } else { 
       _data = _ds; 
      } 

      setGridColumns(); 
     } 

Как только это было сделано, я просто должен был слушать событие сортировки в слушателе AdvancedDataGrid и вызовите setGrouping ([а]) оттуда, следующим образ:

protected function adg1_sortHandler(event:AdvancedDataGridEvent):void 
      { 
       _sortField = event.dataField; 
       if (temp.length == 0) { 
        temp.push(DefaultGroupColumn); 
       } 

       setGrouping(temp) 
       _sort_direction = !_sort_direction; 

Я надеюсь, что это помогает кто то! AAP

Смежные вопросы