【问题标题】:Flex AdvancedDataGrid Custom Sorting problemFlex AdvancedDataGrid 自定义排序问题
【发布时间】:2010-11-17 00:19:02
【问题描述】:

我有一个高级数据网格,我正在实现自定义排序。我的 adv.data 网格在每次后续排序时都会减慢......如果节点被打开,它就会超时。

我的数据如下所示(g = grp on 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 应按如下方式排序和显示数据(g = grp on 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播放器很可能崩溃。

我猜某处存在内存泄漏,但我无法找到它。

如果有人需要完整代码,我很乐意提供。

非常感谢所有帮助

【问题讨论】:

    标签: apache-flex sorting collections adobe advanceddatagrid


    【解决方案1】:

    您应该简单地向 ADG 列提供 sortCompareFunction,而不是这样做。您不必捕获标题点击事件和所有这些。它已经为你完成了。您所要做的就是指定您对特定列的比较将如何进行。

    【讨论】:

    • 对列中的数据进行排序时调用的回调函数。如果未指定此属性,则排序尝试对数据使用基本字符串或数字排序。如果数据不是字符串或数字,或者 dataField 属性不是数据提供者的有效属性,则排序不起作用或将生成异常。如果您指定 labelFunction 属性的值,则还必须为 sortCompareFunction 属性提供一个函数,除非该列不允许排序。
    • sortCompareFunction 将两个对象作为其参数。这些对象可以是任何东西,你的函数代码负责确定要比较对象的哪个属性以及如何比较它。数据绝对不必是字符串或数字。
    【解决方案2】:

    我明白了!... Robusto 感谢您为我指明了正确的方向。在我的情况下,您的建议的问题是我正在从配置文件生成列,因此我可以使这个网格组件可重用。所以正因为如此: 1.我正在使用标签函数 2. column.sortCompareFunction = myfunc 回调根本不能像 Adob​​e 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

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多