AdvancedDataGrid dataField - 如何在 Flex 中使用子数组或对象?

发布于 2024-11-28 06:32:08 字数 3964 浏览 1 评论 0原文

我在 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"/>

如果它是数字字段使用数字排序字段。如果它是来自数据库的日期字符串,请改用 dateSortByField 函数。

I have an advanced data grid in flex (flash builder 4). It's dataProvider is pointing to an ArrayCollection (this._encounters).

Inside that array collection is a property that is an object (a client object).

I tried setting the dataField to "clientObj.firstName" to refer to the first name property within the clientObj property of the this._encounters array collection. It did not show anything.

So, I added a labelFunction to that column (code below) to set the text in the cell. This works fine and now I have values showing in the grid.

The problem is now when I click the title of column to sort it. It throws an error that property clientObj.firstName is not found in my array collection!

So, is there a better way to set the dataField / source for a column and point at a property in a sub-object -- or a way to fix the sort?

Below the first column

<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;
}           

update:
Here is the final working code I used. 3 example sort functions, 1 for numeric sorting, 1 for String sorting and one for Date sorting (string date from a database).:

// 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);
                }
            }

In the mxml above, this is the changed line - notice the stringSortByField added:

        <mx:AdvancedDataGridColumn headerText="first" dataField="clientObj.firstName" sortCompareFunction="{stringSortByField('clientObj','firstName')}" labelFunction="encounterGridLabelFunct"/>

If it were a numeric field use the numericSortByField. If it were a date string from a database, use the dateSortByField function instead.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

单身狗的梦 2024-12-05 06:32:08

您可以使用自定义比较函数,这就是我的做法(显然您的 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);
        }

You could use a custom compare function, thats how I do it (obviously your itemA
and itemB will be different objects, so cast them as such):

In your AdvancedDataGridColumn put in:

sortCompareFunction="string_sortCompareFunc"

and make the function:

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);
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文