【问题标题】:Datagrid sort bug?数据网格排序错误?
【发布时间】:2014-04-09 18:29:09
【问题描述】:

我正在尝试对 DataGrid Flex 组件进行排序,问题是,当我单击箭头对其进行排序时,似乎排序功能不仅对我正在单击的列进行排序,而且对其他列也进行排序。

为了更好地解释它,假设我的行和列是这样的:(null 只是网格中的一个空白区域)

借方_______ 贷方
10__________(空)
(null)________11
12
__________(空) (null)________13

现在,当我点击学分对其进行排序时,会发生以下情况:

借方_______ 贷方
(null)__________13
12
__________(空)
(null__________11
10
________(空)

代替:

借方_______ 贷方
(null)__________13
(null
___________11
12
_________(空) 10________(空)

我调试了它,比较函数接收到 4 个值,10、11、12 和 13,而不是只有两个,13 和 11。这让我想知道,为什么会发生这种情况?排序函数不应该只关心我正在排序的列而不关心其余的列?..

反正结果是乱七八糟的。

【问题讨论】:

    标签: apache-flex sorting datagrid


    【解决方案1】:

    您可以自定义 sortCompareFunction。

    DataGridColumn 将行的数据排序为字符串,如果要比较为数字,则应定义 sortCompareFunction

    即:

    public static function numericCompare(key:String):Function
        {
            return function(itemA:Object, itemB:Object):int
            {
                if (itemA == null && itemB == null)
                    return 0;
    
                if (itemA == null)
                    return 1;
    
                if (itemB == null)
                    return -1;
    
                var emptyA:Boolean = StringUtil.isEmpty(itemA[key]);
                var emptyB:Boolean = StringUtil.isEmpty(itemB[key]);
    
                if (emptyA && emptyB)
                    return 0;
    
                if (emptyA)
                    return 1;
    
                if (emptyB)
                    return -1;
    
                var num1:Number = Number(itemA[key]);
                var num2:Number = Number(itemB[key]);
    
                return mx.utils.ObjectUtil.numericCompare(num1, num2);
            }
        }
    

    【讨论】:

    • 谢谢你,但这不是我要问的。我已经有一个自定义比较功能,它工作得很好,问题是当我对一列进行排序时,它不仅只根据该列对所有行进行排序,而且它也考虑了其他列并且它留下了空白在选定的列中。不知道如何格式化我放置在我的 OP 中的“表格”,我会试一试。
    • 你能给出一个示例代码吗?我自己写了一个例子并测试,它工作正常。
    • 由于项目的规模,这样做有点棘手......如果我只给你 mxmls 可能没有任何意义。无论如何,它似乎与排序功能没有任何关系,因为如果我不指定一个,就会发生同样的奇怪行为。是不是我为两列使用了相同的数据字段名称?即使我用不同的数据填充它们?。
    • 是的,这就是问题所在。列应该是不同的数据字段。列排序,同时使用数据域作为排序域对数据进行排序。
    • 但是,IIRC,当您指定排序比较函数时,dataField 默认排序机制被解除。
    【解决方案2】:

    其实document 说:

    注意:obj1 和 obj2 参数是整个数据提供者元素,而不仅仅是项目的数据。

    所以,这是正常的,也是意料之中的。

    您可能认为它很奇怪或复杂,但 DataGrid 中的许多功能都使用其行的数据,而不仅仅是其列的数据。

    如果他们只提供有关列(或数据字段)的信息,但您需要有关数据的更多信息,那么代码将变得非常肮脏和难闻。或者,您可能需要为此编写数十行代码。

    看,昨天有人遇到了类似的情况:validation in flex datagrid using itemEditor
    (假设您必须对 values 字段进行排序。有些值需要根据其类型进行解析。)

    在现实世界中很方便,可以为您节省很多。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2011-04-19
      • 2015-05-04
      • 2011-05-18
      • 1970-01-01
      • 2012-03-22
      • 2011-02-20
      • 2012-08-25
      • 2011-03-05
      相关资源
      最近更新 更多