如何在使用相同底层ArrayCollection的不同数据网格中查看不同的过滤数据?

时间:2010-11-07 12:48:03

标签: flex actionscript-3

我有一个全局数组收集,它包含与一类数据集有关的所有信息。我希望有不同的数据网格来过滤数据,通常是通过使特定列等同。怎么应该这样呢?

编辑:到目前为止我的想法: 如果有一个数据网格的过滤函数而不是底层的数组,那就可以解决问题。或者,如果可以使用“子集arraycollection”反映全局arraycollection,该子集自动过滤全局arraycollection,当然,也会自动反映底层数组集合中的更改,也可以这样做。这些解决方案中的任何一个都是自然的/平凡的吗?

2 个答案:

答案 0 :(得分:4)

您应该使用ListCollectionView

它允许底层源集合的自定义过滤器。对源集合的更改将反映在已过滤的视图中。

即:

 [Bindable]
 public var allTheData:ArrayCollection;


 <mx:ListCollectionView list="{allTheData}" filterFunction="myFilterFunction" id="filteredView1" />


<mx:DataGrid dataProvider="{filteredView1}" />

答案 1 :(得分:0)

这是一种方法。虽然此示例使用Lists,但它应该适用于DataGrids,因为它是被过滤的集合而不是视图。 “添加列表项”按钮和addListItems()方法显示了一种在基础数据更改时更新过滤后的列表的方法。

<fx:Script>
    <![CDATA[
        private function populateListA(collection:ArrayCollection):ArrayCollection
        {
            var ac:ArrayCollection = new ArrayCollection(collection.source);                
            ac.filterFunction = filterListA;
            ac.refresh();                   
            return ac;
        }

        private function populateListB(collection:ArrayCollection):ArrayCollection
        {
            var ac:ArrayCollection = new ArrayCollection(collection.source);                
            ac.filterFunction = filterListB;
            ac.refresh();               
            return ac;
        }

        private function filterListA(item:Object):Boolean
        {
            return item == "ListA";
        }

        private function filterListB(item:Object):Boolean
        {
            return item == "ListB";
        }

        private function addListItems():void
        {   
            arrayCollection.addItem("ListA");
            arrayCollection.addItem("ListB");               
            listA.dataProvider = populateListA(arrayCollection);
            listB.dataProvider = populateListB(arrayCollection);
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <s:ArrayCollection id="arrayCollection">
        <fx:Array>
            <fx:String>ListA</fx:String>
            <fx:String>ListA</fx:String>
            <fx:String>ListA</fx:String>
            <fx:String>ListB</fx:String>
            <fx:String>ListB</fx:String>
            <fx:String>ListB</fx:String>
        </fx:Array>
    </s:ArrayCollection>
</fx:Declarations>
<s:layout>
    <s:VerticalLayout/>
</s:layout>
<s:List id="listA"
        dataProvider="{populateListA(arrayCollection)}"/>
<s:List id="listB"
        dataProvider="{populateListB(arrayCollection)}"/>
<s:Button click="addListItems()"
          label="Add List Items"/>