Проблема Flex AdvancedDataGrid с пользовательской сортировкой - PullRequest
0 голосов
/ 17 ноября 2010

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

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

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 должна сортировать и отображать данные следующим образом (g = grpпо идентификатору) *:

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.

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

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

С благодарностью за помощь

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

Я понял! ... Робусто, спасибо, что указал мне несколько правильное направление. Проблема с вашим предложением в моем случае заключается в том, что я генерирую столбцы из файла конфигурации, поэтому я могу сделать этот компонент сетки многократно используемым. Так из-за этого: 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 ([abc]) следующим образом:

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

                setGrouping(temp)
                _sort_direction = !_sort_direction;

Надеюсь, это кому-нибудь поможет! AAP

0 голосов
/ 17 ноября 2010

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

...