Используя 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"}
]