我有一个使用客户分组数据的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>
答案 0 :(得分:2)
好像第一行包含空数据或空字符串,并且advanceddatagrid设置为使用分组数据,然后不会调用sort函数。
这有点像黑客,是的,但是如果你可以输入一个不切实际的(例如1/1/1770),可以在数据库/文件读/数据输入级别插入的恒定数据,那么使用column labelFunction如果数据与该列匹配则呈现为null,它应该有效,或者至少调用sort函数。
public function dateCellLabel(item:Object, column:AdvancedDataGridColumn):String
{
var date:String = item[column.dataField];
if (date=="1/1/1770")
return null;
else
return date;
}
很抱歉这么晚回答这个问题,但至少如果其他人试图找到答案,他们可能会看到这个。
答案 1 :(得分:0)
这与SortCompareFunction的逻辑有关。
为所有组节点添加dob:"01/01/1970"
并且排序按预期工作,这是正确的吗?
答案 2 :(得分:0)
我认为问题不在于使用null或空字符串值(完全有效的值)对分组数据进行排序;该
docs清楚地说明dataField
表示的属性必须是dataProvider [item]上的有效属性,即它必须存在,null或其他。
虽然我给RaySir投票,但我不完全同意这是一个黑客,而是你正在规范你的数据,我认为这是一个非常好的表达层事情。
这是一个重复的例子:
<?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.collections.HierarchicalData;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
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", dob: null, children: [
{ name: "User E", dob: "09/13/1972" },
{ name: "User F", dob: "11/22/1993" }
]
},
{ name: "Group B", dob: null, children: [
{ name: "Group B1", dob: null, 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 dob_sort(itemA:Object, itemB:Object):int {
var dateA:Date = itemA.dob ? new Date(itemA.dob) : null;
var dateB:Date = itemB.dob ? new Date(itemB.dob) : null;
return ObjectUtil.dateCompare(dateA, dateB);
}
private function dob_dataTip(item:Object):String {
if (!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) {
return dateFormatter.format(item.dob);
}
return null;
}
private function dob_label(item:Object, col:AdvancedDataGridColumn):String {
if(!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) {
return item.dob;
}
return null;
}
]]>
</mx:Script>
<mx:DateFormatter id="dateFormatter" formatString="MMMM D, YYYY" />
<mx:AdvancedDataGrid id="adgTest" dataProvider="{new HierarchicalData(arrData)}" designViewDataType="tree" width="746" height="400">
<mx:columns>
<mx:AdvancedDataGridColumn headerText="Name" dataField="name"/>
<mx:AdvancedDataGridColumn headerText="Date of birth" dataField="dob"
labelFunction="dob_label"
dataTipFunction="dob_dataTip"
sortCompareFunction="dob_sort"
showDataTips="true" />
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
答案 3 :(得分:0)
虽然在此示例中似乎不是这种情况,但列上缺少的dataField会阻止排序发生。系统正如所描述的那样,从不调用sortCompareFunction。
如果您有一个自定义列渲染器,它会自己从数据中提取字段,那么很容易忽略填充dataField属性。在这种情况下,一切都会正常工作,直到你去排序。不会调用sortCompareFunction。
通过debuggroup HierarchicalCollectionView.as检查,在第1259行左右,在sortCanBeApplied中。