1

我在 Flex 3 中使用 AdvancedDatagrid。AdvancedDatagrid 的一列包含数字和字母。当我对此列进行排序时,数字位于字母之前(AdvancedDatagrid 内部排序的默认行为)。但是我希望在排序时字母排在数字之前。

我知道我将不得不编写自定义排序功能。但是任何人都可以就如何进行。

提前致谢。

4

1 回答 1

1

使用sortCompareFunction

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会先于123a12仍会先于abc

如果您想要一种完全不同的排序方式,其中字母总是在数字之前而不考虑它们在字符串中的位置,您将不得不从头开始编写一个 - String::charCodeAt可能是一个不错的起点。

于 2010-08-26T04:22:37.807 回答