Flex AdvancedDataGrid - установка правильной функции сортировки во время выполнения - PullRequest
1 голос
/ 27 августа 2009

Используя Flex 3.2, у меня есть объект, который расширяет TitleWindow. В этом TitleWindow у меня есть AdvancedDataGrid.

При создании этого объекта я передаю ему 2 списка, один полный данных для отображения, а другой - массив определений столбцов. Это позволяет мне во время выполнения создавать правильные столбцы и определять правильные атрибуты отображения для каждого столбца (например, логические значения будут отображаться в виде флажков, а даты форматируются в определенном формате (поступающем из фида XML в различных *) 1003 * STRING форматы, где возможны нули)

Проблема в том, что сортировка по умолчанию, основанная на строке, не работает 100% времени, и даже если формат такой, который будет отсортирован правильно, она завершится неудачно, если задействованы пустые значения.

Приведенную выше проблему легко решить, используя sortCompareFunction, но факт заключается в том, что когда вы устанавливаете sortCompareFunction для столбца, вам, вероятно, потребуется жестко закодировать имя столбца в функцию.

Есть ли способ обойти эту последнюю проблему?

для справки вот функция, которую я использую для создания столбцов:

    private function setupGrid():void
    {

        var localcols:Array = new Array();
        datagrid1.columns = new Array();


        var gcol:AdvancedDataGridColumn = new AdvancedDataGridColumn();
            gcol.headerText = "Group";
            gcol.dataField="GroupLabel";                
            localcols.push(gcol);

        for each (var s:Object in DGColumns)
        {               
            var col:AdvancedDataGridColumn = new AdvancedDataGridColumn();
            col.headerText = s.Header;
            col.dataField=s.Column;
            col.headerWordWrap = true;
            //col.sortable = false;             

            try
            {
                switch (s.type)
                {
                    case "boolean":
                        col.labelFunction = boolCellLabel;                           
                        break;
                    case "date":
                        col.labelFunction = dateCellLabel;
                        col.sortCompareFunction = dateCompare; // doesn't work, as the function requires the column name coded into it
                        // inline does not work because s.Column is still set to the last column in the grid at sort time 
                        col.sortCompareFunction = function (obj1, obj2):int
                            {
                                var l:XML = obj1 as XML;
                                var r:XML = obj2 as XML;

                                var left:Date = new Date( l.elements(s.Column).valueOf() );
                                var right:Date = new Date( r.elements(s.Column).valueOf() );


                                if (left == null && right == null) return 0;
                                else if (left == null) return -1
                                else if (right == null) return 1 
                                else if (left < right) return -1;
                                else if (left > right) return 1;
                                else return 0;
                        ;
                        break;
                    case "string": // use defaults
                    default:
                        break;
                }
            }
            catch (ex:Object) 
            {}              
            localcols.push(col);                                
        }
        datagrid1.columns = localcols;      
    }

и для определения столбца:

var DGColumns:Array = [{Header:"Lorem ipsum", Column: "lorem", type:"string"},                      
{Header:"dolor", Column: "dolor" , type:"string"},
{Header:"sit amet", Column: "sitAmet", type:"string"},
{Header:"consectetur", Column: "consecteturDate", type:"date"},
{Header:"adipiscing", Column: "adipiscingDate", type:"date"},
{Header:"elit", Column: "isElit" , type:"boolean"}
]

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Нашел ответ. Это решение из нескольких частей.
Часть 1: установите функцию сравнения, как я пытался сначала:

col.sortCompareFunction = dateCompare;


часть 2: добавьте обработчик события headerRelease в AdvancedDataGrid

<mx:AdvancedDataGrid -otherAttributes- headerRelease="HeaderClick(event)"   >


часть 3: определить обработчик события и глобальную переменную, чтобы запомнить столбец

private var clickedCol:AdvancedDataGridColumn      
private function HeaderClick(event:AdvancedDataGridEvent):void 
  {
   clickedCol = AdvancedDataGridColumn(event.currentTarget.columns[event.columnIndex]);

  }


часть 4: скажите функции сравнения, как использовать столбец

public function dateCompare(obj1:Object, obj2:Object):int 
        { 
         trace ("compare");

         var l:XML = obj1 as XML;
      var r:XML = obj2 as XML;

      var lDateStr:String = l.elements(clickedCol.dataField).valueOf()
      var rDateStr:String = r.elements(clickedCol.dataField).valueOf()
      // compare logic goes here
      }


часть 5: построить / запустить / получить прибыль

0 голосов
/ 13 ноября 2010
protected function headerReleaseHandler(event:AdvancedDataGridEvent):void
{
  //event.dataField will give you column name

  //call sort compare fn
}
0 голосов
/ 01 сентября 2009

объявляет все функции сравнения сортировки снаружи (на уровне класса) и присваивает имя соответствующей функции sortCompareFunction во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...