views:

141

answers:

1

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.

+1  A: 

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.

Amarghosh