コード (文字列) と値 (数値) の 2 つの列を持つ AdvancedDatagrid があります。各列に同じソート関数を使用します。私がやりたいのは、Value 列 (数値データ) に基づいて両方の列を並べ替えることですが、利用可能な数字がない場合は、並べ替えを Code 列のアルファベット順に実行したいと考えています。
私がやろうとしていることを表す例で、直面している問題を単純化しました。
この図は 2 つの列を示しており、値列に基づいて両方の列が並べ替えられています。値が NaN の場合、Code 列の値をアルファベット順に並べ替えます。したがって、1、2、3、4 は同じままですが、BADC は ABCD になります。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" minWidth="955" minHeight="600" initialize="initializeHandler(event)">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import mx.utils.ObjectUtil;
[Bindable]
private var ac:ArrayCollection;
protected function initializeHandler(event:FlexEvent):void
{
ac = new ArrayCollection();
var one:NameValueObject = new NameValueObject("One", 1);
var two:NameValueObject = new NameValueObject("Two", 2);
var three:NameValueObject = new NameValueObject("Three", 3);
var four:NameValueObject = new NameValueObject("Four", 4);
var a:NameValueObject = new NameValueObject("A", NaN);
var b:NameValueObject = new NameValueObject("B", NaN);
var c:NameValueObject = new NameValueObject("C", NaN);
var d:NameValueObject = new NameValueObject("D", NaN);
ac.addItem(one);
ac.addItem(two);
ac.addItem(three);
ac.addItem(four);
ac.addItem(b);
ac.addItem(a);
ac.addItem(d);
ac.addItem(c);
}
private function numericValueSort(obj1:Object, obj2:Object):int
{
var value1:Number = (obj1 as NameValueObject).value;
var value2:Number = (obj2 as NameValueObject).value;
return ObjectUtil.numericCompare(value1, value2);
}
private function codeLabelFunction(item:Object, column:AdvancedDataGridColumn):String
{
return (item as NameValueObject).code;
}
]]>
</mx:Script>
<mx:AdvancedDataGrid width="500" height="300" dataProvider="{ac}">
<mx:columns>
<mx:AdvancedDataGridColumn id="codeColumn"
headerText="Code"
dataField="value"
labelFunction="codeLabelFunction"
sortCompareFunction="numericValueSort">
</mx:AdvancedDataGridColumn>
<mx:AdvancedDataGridColumn id="numericValueColumn"
headerText="Value"
dataField="value"
sortCompareFunction="numericValueSort">
</mx:AdvancedDataGridColumn>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
NaveValueObject クラス
package
{
public class NameValueObject
{
public var code:String;
public var value:Number;
public function NameValueObject(aCode:String, aNumber:Number)
{
code = aCode;
value = aNumber;
}
}
}