AdvancedDataGrid dataField - как использовать подмассив или объект в flex? - PullRequest
1 голос
/ 05 августа 2011

У меня есть расширенная сетка данных в flex (Flash Builder 4). Это dataProvider указывает на ArrayCollection (this._encounters).

Внутри этой коллекции массивов находится свойство, являющееся объектом (клиентским объектом).

Я попытался установить для dataField значение clientObj.firstName, чтобы сослаться на свойство имени в свойстве clientObj коллекции массивов this._encounters. Ничего не показывало.

Итак, я добавил 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 для сортировки строк и одна для сортировки по дате (строковая дата из базы данных).:

// 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 Ответ

1 голос
/ 05 августа 2011

Вы можете использовать пользовательскую функцию сравнения, вот как я это делаю (очевидно, ваш элемент A и 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);
        }
...