我在 Flex 3 中使用 AdvancedDatagrid。AdvancedDatagrid 的一列包含数字和字母。当我对此列进行排序时,数字位于字母之前(AdvancedDatagrid 内部排序的默认行为)。但是我希望在排序时字母排在数字之前。
我知道我将不得不编写自定义排序功能。但是任何人都可以就如何进行。
提前致谢。
我在 Flex 3 中使用 AdvancedDatagrid。AdvancedDatagrid 的一列包含数字和字母。当我对此列进行排序时,数字位于字母之前(AdvancedDatagrid 内部排序的默认行为)。但是我希望在排序时字母排在数字之前。
我知道我将不得不编写自定义排序功能。但是任何人都可以就如何进行。
提前致谢。
AdvancedDataGrid 控件使用此函数对数据提供程序集合的元素进行排序。回调函数的函数签名有两个参数,形式如下:
mySortCompareFunction(obj1:Object, obj2:Object):int
obj1 - 要比较的数据元素。
obj2 - 要与 obj1 比较的另一个数据元素。
该函数应根据对象的比较返回一个值:
- -1 如果 obj1 应该按升序出现在 obj2 之前。
- 0 如果 obj1 = obj2。
- 1 如果 obj1 应按升序出现在 obj2 之后。
<mx:AdvancedDataGridColumn sortCompareFunction="mySort"
dataField="colData"/>
尝试以下排序比较功能。
public function mySort(obj1:Object, obj2:Object):int
{
var s1:String = obj1.colData;
var s2:String = obj2.colData;
var result:Number = s1.localeCompare(s2);
if(result != 0)
result = result > 0 ? 1 : -1;
if(s1.match(/^\d/))
{
if(s2.match(/^\d/))
return result;
else
return 1;
}
else if(s2.match(/^\d/))
return -1;
else
return result;
}
它检查字符串的第一个字符,并将以数字开头的字符按排序顺序向下推。它使用localeCompare来比较两个字符串,如果它们都以字母或数字开头 - 否则它说以字母开头的字符串应该在带有数字的字符串之前。因此abc
会先于123
但a12
仍会先于abc
。
如果您想要一种完全不同的排序方式,其中字母总是在数字之前而不考虑它们在字符串中的位置,您将不得不从头开始编写一个 - String::charCodeAt可能是一个不错的起点。