我在flex中有一个高级数据网格(flash builder 4)。它的dataProvider指向一个ArrayCollection(this._encounters)。
在该数组集合中是一个属性,它是一个对象(客户端对象)。
我尝试将dataField设置为“clientObj.firstName”以引用this._encounters数组集合的clientObj属性中的第一个name属性。它没有显示任何东西。
因此,我在该列(下面的代码)中添加了labelFunction来设置单元格中的文本。这工作正常,现在我在网格中显示了值。
现在问题是当我点击列标题进行排序时。它抛出一个错误,即在我的数组集合中找不到属性clientObj.firstName!
那么,是否有更好的方法为列设置dataField / source并指向子对象中的属性 - 或者是修复排序的方法?
第一栏下方
<mx:AdvancedDataGrid x="0" y="25" id="adgEncounters" designViewDataType="flat" width="100%" height="100%" dataProvider="{this._encounters}">
<mx:columns>
<mx:AdvancedDataGridColumn headerText="first" dataField="clientObj.firstName" labelFunction="encounterGridLabelFunct"/>
<mx:AdvancedDataGridColumn headerText="first" dataField="thisWorksField"/>
</mx:columns>
</mx:AdvancedDataGrid>
protected function encounterGridLabelFunct(item:Object, column:AdvancedDataGridColumn):String //put just the HH:MM in to the grid, not the whole date string
{
if(column.headerText=="first") result=item.clientObj.firstName;
return result;
}
更新: 这是我使用的最终工作代码。 3个示例排序函数,1个用于数字排序,1个用于字符串排序,1个用于日期排序(字符串日期来自数据库)。:
// sort adg column numerically
private function numericSortByField(subObjectName:String, fieldName:String):Function
{
return function(obj1:Object, obj2:Object):int
{
var value1:Number = (obj1[subObjectName][fieldName] == '' || obj1[subObjectName][fieldName] == null) ? null : new Number(obj1[subObjectName][fieldName]);
var value2:Number = (obj2[subObjectName][fieldName] == '' || obj2[subObjectName][fieldName] == null) ? null : new Number(obj2[subObjectName][fieldName]);
return ObjectUtil.numericCompare(value1, value2);
}
}
//sort adg column string
private function stringSortByField(subObjectName:String, fieldName:String):Function
{
return function(obj1:Object, obj2:Object):int
{
var value1:String = (obj1[subObjectName][fieldName] == '' || obj1[subObjectName][fieldName] == null) ? null : new String(obj1[subObjectName][fieldName]);
var value2:String = (obj2[subObjectName][fieldName] == '' || obj2[subObjectName][fieldName] == null) ? null : new String(obj2[subObjectName][fieldName]);
return ObjectUtil.stringCompare(value1, value2);
}
}
//sort adg date diff (takes date strings for example from a db)
private function dateSortByField(subObjectName:String, fieldName:String):Function
{
return function(obj1:Object, obj2:Object):int
{
var value1:String = (obj1[subObjectName][fieldName] == '' || obj1[subObjectName][fieldName] == null) ? null : new String(obj1[subObjectName][fieldName]);
var value2:String = (obj2[subObjectName][fieldName] == '' || obj2[subObjectName][fieldName] == null) ? null : new String(obj2[subObjectName][fieldName]);
var value1Date:Date = new Date();
var value1Time:int = value1Date.setTime(Date.parse(value1));
var value2Date:Date = new Date();
var value2Time:int = value2Date.setTime(Date.parse(value2));
return ObjectUtil.numericCompare(value1Time, value2Time);
}
}
在上面的mxml中,这是更改的行 - 请注意添加的stringSortByField:
<mx:AdvancedDataGridColumn headerText="first" dataField="clientObj.firstName" sortCompareFunction="{stringSortByField('clientObj','firstName')}" labelFunction="encounterGridLabelFunct"/>
如果是数字字段,请使用numericSortByField。如果它是数据库中的日期字符串,请改用dateSortByField函数。
答案 0 :(得分:1)
您可以使用自定义比较功能,这就是我的方式(显然是您的itemA 和itemB将是不同的对象,因此将它们转换为:)
放入的AdvancedDataGridColumn:
sortCompareFunction="string_sortCompareFunc"
并制作功能:
private function string_sortCompareFunc(itemA:Object, itemB:Object):int
{
var a:String = itemA as String;
var b:String = itemB as String;
return ObjectUtil.stringCompare(a, b);
}