如何在Flex AdvancedDataGrid中排序-未调用回调
时间:2020-03-06 14:57:01 来源:igfitidea点击:
我有一个AdvancedDataGrid,它使用数据的客户分组。并非所有组都将在层次结构中处于同一级别,并且组可以同时包含组和成员。我们有一个排序回调,但是除最叶级别的组外,没有被调用。请参见下面的代码作为示例-展开所有组,然后单击"出生日期"上的排序列以按出生日期进行反向排序。 (奇怪的是,出于某种不可思议的原因,第一个升序排序有效。)
我们不会收到与组成员处于同一级别的任何数据。
我该如何解决?
谢谢。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" backgroundColor="white" > <mx:Script> <![CDATA[ import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; import mx.collections.HierarchicalData; import mx.utils.ObjectUtil; private var arrData : Array = [ { name: "User A", dob: "04/14/1980" }, { name: "User B", dob: "01/02/1975" }, { name: "Group A", children: [ { name: "User E", dob: "09/13/1972" }, { name: "User F", dob: "11/22/1993" } ] }, { name: "Group B", children: [ { name: "Group B1", children: [ { name: "User I", dob: "01/23/1984" }, { name: "User J", dob: "11/10/1948" } ] }, { name: "User G", dob: "04/09/1989" }, { name: "User H", dob: "06/20/1963" } ] }, { name: "User C", dob: "12/30/1977" }, { name: "User D", dob: "10/27/1968" } ]; private function date_sortCompareFunc(itemA:Object, itemB:Object):int { if ( itemA.hasOwnProperty("dob") && itemB.hasOwnProperty("dob")) { var dateA:Date = new Date(Date.parse(itemA.dob)); var dateB:Date = new Date(Date.parse(itemB.dob)); return ObjectUtil.dateCompare(dateA, dateB); } else if ( itemA.hasOwnProperty("dob")) { return 1; } else if (itemB.hasOwnProperty("dob")) { return -1; } return ObjectUtil.stringCompare(itemA.name, itemB.name); } private function date_dataTipFunc(item:Object):String { if (item.hasOwnProperty("dob")) { return dateFormatter.format(item.dob); } return ""; } private function label_dob(item:Object, col:AdvancedDataGridColumn):String { var dob:String=""; if(item.hasOwnProperty("dob")) { dob=item.dob; } return dob; } ]]> </mx:Script> <mx:DateFormatter id="dateFormatter" formatString="MMMM D, YYYY" /> <mx:AdvancedDataGrid id="adgTest" dataProvider="{new HierarchicalData(this.arrData)}" designViewDataType="tree" width="746" height="400"> <mx:columns> <mx:AdvancedDataGridColumn headerText="Name" dataField="name"/> <mx:AdvancedDataGridColumn dataField="dob" headerText="Date of birth" labelFunction="label_dob" sortCompareFunction="date_sortCompareFunc" showDataTips="true" dataTipFunction="date_dataTipFunc" /> </mx:columns> </mx:AdvancedDataGrid> </mx:Application>
解决方案
这与SortCompareFunction的逻辑有关。
将dob:" 01/01/1970"
放到所有组节点上,排序按预期进行,对吗?
似乎第一行包含空数据或者空字符串,并且将Advanceddatagrid设置为使用分组数据,然后不会调用sort函数。
有点麻烦,是的,但是如果我们可以放入不切实际的数据(例如1/1/1770),可以在数据库/文件读取/数据输入级别插入恒定的数据,则可以使用labelFunction列如果数据与该列匹配,应该工作或者至少将调用sort函数,则将其呈现为null。
public function dateCellLabel(item:Object, column:AdvancedDataGridColumn):String { var date:String = item[column.dataField]; if (date=="1/1/1770") return null; else return date; }
很抱歉这么晚才回答,但至少如果其他人试图找到答案,他们可能会看到。