2015-10-28 26 views
1

我需要通過Flex 3.5中的數據網格上的項目編號來排序項目數組。在flex中對數組網格中的點進行排序項目編號

我實際上並不需要在數據網格內重新排序它,我只是需要它在arraycollection上已經排序,然後再發送到數據提供者。

我的問題是,proprety「ITEM_NUMBER」,我需要進行排序這是一個字符串,並將其與批號和一個點,這樣構建的:

1.1, 1.2, 1.3, 2.1 , 2.2,3.1 , 3.2,3.3 , 3.4, 3.5,3.6 , 3.7,3.8 , 3.9, 3.10,3.11

我需要它這樣的命令。

如果我試圖按數字順序排列它們,3.2大於3.11,所以它不起作用。我需要首先按照點之前的整數排序,然後再按點之後的整數排序,然後再移動到點之前的下一個整數之前

另外我還有另一個問題。 item_number屬性位於我的arraycollection上另一個對象內的對象內。

要得到它,我必須:

array_collection.item.item_number

所以總結起來,我需要列出一個屬性有序的排列是這樣的arrayitem的另一個對象中,它是一個由點分隔的字符串上的數字。

這是我的代碼的簡化版本:

<mx:Script> 
<![CDATA[  
    public function print_data_grid(array_collection):void 
    { 
     my_data_grid.dataProvider = array_collection 
    } 
]]> 
</mx:Script> 

<mx:DataGrid id="my_data_grid"> 
<mx:columns> 
    <mx:DataGridColumn headerText="# Item"> 
     <mx:itemRenderer> 
      <mx:Component> 
       <mx:Label toolTip="{this.text}" text="{data.product.item_number}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
    </mx:DataGridColumn> 

    <mx:DataGridColumn headerText="Item Name"> 
     <mx:itemRenderer> 
      <mx:Component> 
       <mx:Label toolTip="{this.text}" text="{data.product.name}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
    </mx:DataGridColumn> 
</mx:columns> 
</mx:DataGrid> 
+0

見http://stackoverflow.com/questions/9429142/how-to-sort-an-arraycollection-in-flex – Brian

回答

2

您可以編寫自定義排序功能。這是一個例子。請檢查它是否滿足您的要求。

<?xml version="1.0"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx"> 
<fx:Script> 
<![CDATA[ 
    import mx.collections.ArrayCollection; 
    import mx.collections.Sort; 
    import mx.utils.ObjectUtil; 

    private var myArrayCollection:ArrayCollection = new ArrayCollection([ 
     {product: {item_number: "1.1", name: "A"}}, 
     {product: {item_number: "10.2", name: "Lottery"}}, 
     {product: {item_number: "10.11", name: "Book"}}, 
     {product: {item_number: "1.13", name: "DVD"}}, 
     {product: {item_number: "1.221", name: "Car"}}, 
     {product: {item_number: "1.211", name: "Mobile"}}, 
     {product: {item_number: "10.1111", name: "Laptop"}}, 
     {product: {item_number: "11.1", name: "Camera"}}, 
     {product: {item_number: "12.1", name: "Desktop"}}, 
     {product: {item_number: "144.41", name: "iPad"}}, 
     {product: {item_number: "14.21", name: "Tablet"}}, 
     {product: {item_number: "14.111", name: "Android phone"}}, 
     {product: {item_number: "10.1", name: "TV"}}, 
     {product: {item_number: "10.100", name: "Bulb"}}]); 

    private function createCopyOfArrayCollection():ArrayCollection 
    { 
     var copyOfArrayCollection:ArrayCollection = new ArrayCollection(); 
     for(var i = 0; i < myArrayCollection.length; i++) 
     { 
      copyOfArrayCollection.addItem(mx.utils.ObjectUtil.copy(myArrayCollection[i])); 
     } 
     return copyOfArrayCollection; 
    } 

    private function onButtonClick():void { 
     var copyOfArrayCollection:ArrayCollection = createCopyOfArrayCollection(); 
     var sort:Sort = new Sort(); 
     sort.compareFunction = sortFunction; 
     copyOfArrayCollection.sort = sort; 
     copyOfArrayCollection.refresh(); 
     print_data_grid(copyOfArrayCollection); 
    } 

    private function sortFunction(a:Object, b:Object, array:Array = null):int { 
     //assuming all item_number contains one decimal 
     var itemNumberA:String = a.product.item_number; 
     var itemNumberASplitArray:Array = itemNumberA.split(".", 2); 
     var itemNumberB:String = b.product.item_number; 
     var itemNumberBSplitArray:Array = itemNumberB.split(".", 2); 

     if (Number(itemNumberASplitArray[0]) == Number(itemNumberBSplitArray[0])) { 
      if (Number(itemNumberASplitArray[1]) == Number(itemNumberBSplitArray[1])) { 
       return 0; 
      } 
      else if (Number(itemNumberASplitArray[1]) > Number(itemNumberBSplitArray[1])) { 
       return 1; 
      } 
      else { 
       return -1; 
      } 
     } 
     else if (Number(itemNumberASplitArray[0]) > Number(itemNumberBSplitArray[0])) { 
      return 1; 
     } 
     else { 
      return -1; 
     } 
    } 

    public function print_data_grid(array_collection):void { 
     my_data_grid2.dataProvider = array_collection 
    } 
    ]]> 
</fx:Script> 
<mx:HBox verticalCenter="0" horizontalCenter="0"> 
    <mx:Panel title="Unsorted Data"> 
     <mx:DataGrid id="my_data_grid" dataProvider="{myArrayCollection}" height="400"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="# Item"> 
        <mx:itemRenderer> 
         <fx:Component> 
          <mx:Label toolTip="{this.text}" text="{data.product.item_number}"/> 
         </fx:Component> 
        </mx:itemRenderer> 
       </mx:DataGridColumn> 

       <mx:DataGridColumn headerText="Item Name"> 
        <mx:itemRenderer> 
         <fx:Component> 
          <mx:Label toolTip="{this.text}" text="{data.product.name}"/> 
         </fx:Component> 
        </mx:itemRenderer> 
       </mx:DataGridColumn> 
      </mx:columns> 
     </mx:DataGrid> 
    </mx:Panel> 

    <mx:VBox height="100%"> 
     <mx:Spacer percentHeight="50"/> 
     <mx:Button label=">>- Show sorted data ->>" click="{onButtonClick()}"/> 
     <mx:Spacer percentHeight="50"/> 
    </mx:VBox> 
    <mx:Panel title="Sorted Data"> 
     <mx:DataGrid id="my_data_grid2" height="400"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="# Item"> 
        <mx:itemRenderer> 
         <fx:Component> 
          <mx:Label toolTip="{this.text}" text="{data.product.item_number}"/> 
         </fx:Component> 
        </mx:itemRenderer> 
       </mx:DataGridColumn> 

       <mx:DataGridColumn headerText="Item Name"> 
        <mx:itemRenderer> 
         <fx:Component> 
          <mx:Label toolTip="{this.text}" text="{data.product.name}"/> 
         </fx:Component> 
        </mx:itemRenderer> 
       </mx:DataGridColumn> 
      </mx:columns> 
     </mx:DataGrid> 
    </mx:Panel> 
</mx:HBox> 

</s:Application> 

enter image description here