【问题标题】:AdvancedDataGrid dataField - how to use a subarray or object in flex?AdvancedDataGrid dataField - 如何在 flex 中使用子数组或对象?
【发布时间】:2011-10-20 23:50:24
【问题描述】:

我在 flex (flash builder 4) 中有一个高级数据网格。它的 dataProvider 指向一个 ArrayCollection (this._encounters)。

在该数组集合内部是一个作为对象(客户端对象)的属性。

我尝试将 dataField 设置为“clientObj.firstName”以引用 this._encounters 数组集合的 clientObj 属性中的名字属性。它没有显示任何东西。

所以,我在该列(下面的代码)中添加了一个 labelFunction 来设置单元格中的文本。这工作正常,现在我在网格中显示了值。

现在的问题是当我单击列标题对其进行排序时。它会抛出一个错误,即在我的数组集合中找不到属性 clientObj.firstName!

那么,有没有更好的方法来设置列的数据字段/源并指向子对象中的属性——或者修复排序的方法?

第一列下方

<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 函数。

【问题讨论】:

  • +1 非常好的帖子 - 在这里排序的好例子

标签: apache-flex flash-builder advanceddatagrid datafield


【解决方案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);
        }

【讨论】:

  • 这样至少可以防止错误并且看起来它正在尝试排序,因为记录的顺序确实发生了变化,但它们没有按顺序排列。例如 aaa bbb ddd aaa bbb zzz
  • 我记得有一些排序问题....为每个列创建一个排序函数..另外,谷歌已知排序问题(认为存在已知问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多