2015-10-28 22 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