2010-08-25 43 views
1

我在Flex 3中使用AdvancedDatagrid。AdvancedDatagrid的一列包含數字和字母。當我對此列進行排序時,數字會以字母開頭(AdvancedDatagrid的內部排序的默認行爲)。但是當我排序時,我希望字母在數字前出現。我知道我將不得不編寫自定義排序功能。但是,任何人都可以提出一些關於如何進行的想法。在Flex 3中的AdvancedDatagrid中排序

在此先感謝。

回答

1

使用sortCompareFunction

AdvancedDataGrid控件使用此函數對數據提供程序集合中的元素進行排序。回調函數的函數簽名採用兩個參數,並且具有以下形式:

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

OBJ1 - 數據元素進行比較。

obj2 - 與obj1進行比較的另一個數據元素。

函數應該返回基於對象的比較值:

  • -1,如果obj1應以升序出現在obj2前面。
  • 0 if ifj1 = 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可能是一個很好的開始。