2010-08-18 45 views
1

我正在创建一个显示来自MySQL数据库的信息的表,我使用遍历整个地方的外键来交叉引用数据。Flex - 按行标签对DataGrid列进行排序

基本上我有一个名为'system'的列的datagrid。该系统是一个int,它代表另一个表中的对象的id。我已经使用lableFunction来交叉引用这两个并重命名该列。但现在排序不起作用,我知道你必须创建一个自定义的排序功能。我试过再次交叉引用这两个表,但是这需要大约30秒来对1200行进行排序。现在我只是无能为力,接下来我应该尝试一下。

有什么办法可以访问排序函数内的列字段标签吗?

public function order(a:Object,b:Object):int 
{ 
    var v1:String = a.sys; 
    var v2:String = b.sys; 
    if (v1 < v2){ 
     trace(-1); 
     return -1; 
    }else if (v1 > v2){ 
     trace(1); 
     return 1; 
    }else { 
     trace(0); 
     return 0; 
    } 
}

回答

1

处理此问题的一种方法是,通过收到的对象并根据交叉引用的ID将标签添加为每个对象的属性。然后,您可以指定您的标签属性以显示在数据网格列中,而不是使用标签功能。这样你就可以像预期的那样进行排序,而不必创建自己的排序功能。

+0

我认为这是我必须要做的。我试图保留所有的数据,但我认为这不会发生。我会试一试。 – noazark 2010-08-18 23:02:54

+0

感谢千里眼,事情似乎很有效地工作。 基本上,我保持模型中的所有表单独使用(使用robotlegs),当表更新时,它调用一个方法将交叉引用的字段添加到表格行中。我没有多少注意到(如果有的话)额外的滞后。再次感谢。 – noazark 2010-08-19 00:09:32

0

DataGrid和其他基于列表的类的工作方式是使用itemRenderer。渲染器仅针对屏幕上显示的数据创建。在大多数情况下,dataProvider中的数据比屏幕上显示的要多得多。

试图根据dataGrid显示的内容对数据进行排序很可能不会给你想要的结果。

但是,没有理由不能在sortFunction中的数据对象上调用相同的标签函数。

一种方法是使用DataGrid的itemToLabel功能:

var v1:String = dataGrid.itemToLabel(a); 
var v2:String = dataGrid.itemToLabel(b); 

的第二种方法是只调用了labelFunction明确:

var v1:String = labelFunction(a); 
var v2:String = = labelFunction(b); 

根据我的经验,我发现排序是非常快,但是你的记录集比我通常在同一时间在内存中加载的记录集稍大。