Flex 3 中的 AdvancedDatagrid 排序

发布于 2024-09-16 04:27:35 字数 191 浏览 5 评论 0原文

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

我知道我必须编写自定义排序函数。但任何人都可以给出一些关于如何进行的想法吗?

提前致谢。

I am using AdvancedDatagrid in Flex 3. One column of AdvancedDatagrid contains numbers and alphabets. When I sort this column, numbers come before alphabets (Default behavior of internal sorting of AdvancedDatagrid). But I want alphabets to come before number when I sort.

I know I will have to write the custom sort function. But can anybody give some idea on how to proceed.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风疏影 2024-09-23 04:27:35

使用 sortCompareFunction

AdvancedDataGrid 控件使用此函数对数据提供程序集合的元素进行排序。回调函数的函数签名有两个参数,格式如下:

mySortCompareFunction(obj1:Object, obj2:Object):int

obj1 — 要比较的数据元素。

obj2 — 与 obj1 进行比较的另一个数据元素。

该函数应根据对象的比较返回一个值:

  • 如果 obj1 应按升序出现在 obj2 之前,则为 -1。
  • 如果 obj1 = obj2,则为 0。
  • 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 可能是一个不错的起点。

Use sortCompareFunction

The AdvancedDataGrid control uses this function to sort the elements of the data provider collection. The function signature of the callback function takes two parameters and has the following form:

mySortCompareFunction(obj1:Object, obj2:Object):int

obj1 — A data element to compare.

obj2 — Another data element to compare with obj1.

The function should return a value based on the comparison of the objects:

  • -1 if obj1 should appear before obj2 in ascending order.
  • 0 if obj1 = obj2.
  • 1 if obj1 should appear after obj2 in ascending order.
<mx:AdvancedDataGridColumn sortCompareFunction="mySort" 
    dataField="colData"/>

Try the following sort compare function.

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;
}

It checks the first character of strings and pushes the ones that start with a digit downwards in the sort order. It uses localeCompare to compare two strings if they both start with letters or digits - otherwise it says the one starting with a letter should come before the one with digit. Thus abc will precede 123 but a12 will still come before abc.

If you want a totally different sort where letters always precede numbers irrespective of their position in the string, you would have to write one from the scratch - String::charCodeAt might be a good place to start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文