我试图对DataGrid Flex组件进行排序,问题是,当我单击箭头对其进行排序时,排序函数似乎不仅可以对我点击的列进行排序,还可以对其他列进行排序列也是。
为了更好地解释它,让我说我的行和列是这样的:(null只是网格中的空白区域)
借记_ _ __ _ __ credit
10 的 _ __ _ __ _ ___ (空)
(空)的 的 __ _ __ _ __ 11
12 的 _ __ _ __ _ ___ (空)
(空)的 的 __ _ __ _ _ _13
现在,当我点击点数进行排序时,会发生这种情况:
借记_ _ __ _ __ credit
(空)的 的 __ _ __ _ ____ 13
12 的 _ __ _ __ _ __ _ (空)
(null_的 _ __ _ __ _ __ 11
10 的 _ __ _ ____ (空)
而不是:
借记_ _ __ _ __ credit
(空)的 的 __ _ __ _ ____ 13
(空的 _ __ _ __ _ ____ 11
12 的 _ __ _ __ _ __ (空)
10 的 _ __ _ ____ (空)
我调试了它,比较函数正在接收4个值,10,11,12和13,而不是只有两个,13和11.这让我想知道,为什么会发生这种情况?,不应该排序功能只关心我排序的列而不是其余的排序?..
无论如何,结果搞砸了。
答案 0 :(得分:0)
你可以自己定制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);
}
}
答案 1 :(得分:0)
实际上,document说:
注意:obj1和obj2参数是整个数据提供者元素,而不仅仅是项目的数据。
所以,这是正常的和预期的。
您可能认为它很奇怪或很复杂,但DataGrid中的许多功能都使用其行的数据,而不仅仅是其列的数据。
如果他们只提供有关列(或数据字段)的信息,但您需要有关数据的更多信息,那么代码将变得非常脏和臭。或者,您可能必须为此编写几十行代码。
看,有人处于类似情况,就在昨天:validation in flex datagrid using itemEditor
(想象一下,您必须对值字段进行排序。某些值需要根据其类型进行解析。)
方便,在现实世界中为您节省了很多。