Apache flex Flex datagrid和嵌套数组数据提供程序

Apache flex Flex datagrid和嵌套数组数据提供程序,apache-flex,actionscript-3,datagrid,flex3,Apache Flex,Actionscript 3,Datagrid,Flex3,我在许多项目中使用了datagrid,使用以下“常用数据结构”填充网格,并带来了标准o/p,如下图所示。 但是现在对于一个赋值,我想使用下面提到的“复杂数据结构”(嵌套数组)得到相同的网格结果。我有一些想法,即在将数据推送到网格之前处理数据,但问题是我需要通过网格渲染器执行一些更新、编辑和删除操作,同样的操作也应该反映到源集合中。请让我知道是否有一种方法可以使用“复杂结构”,并使用任何flex内置属性实现预期的o/p。提前谢谢 常用数据结构 steps = [a,b,c]; a = {x:100

我在许多项目中使用了datagrid,使用以下“常用数据结构”填充网格,并带来了标准o/p,如下图所示。 但是现在对于一个赋值,我想使用下面提到的“复杂数据结构”(嵌套数组)得到相同的网格结果。我有一些想法,即在将数据推送到网格之前处理数据,但问题是我需要通过网格渲染器执行一些更新、编辑和删除操作,同样的操作也应该反映到源集合中。请让我知道是否有一种方法可以使用“复杂结构”,并使用任何flex内置属性实现预期的o/p。提前谢谢

常用数据结构

steps = [a,b,c];
a = {x:100,y:y1,z:z1};
b = {x:200,y:y2,z:z2};
c = {x:300,y:y3,z:z3};
[] is an Array collection not Array type.    
a = [100,y1,z1];
b = [200,y2,z2];
c = [300,y3,z3];
steps = [[a,some objects],[b,some objects],[c,some objects]];
复杂数据结构

steps = [a,b,c];
a = {x:100,y:y1,z:z1};
b = {x:200,y:y2,z:z2};
c = {x:300,y:y3,z:z3};
[] is an Array collection not Array type.    
a = [100,y1,z1];
b = [200,y2,z2];
c = [300,y3,z3];
steps = [[a,some objects],[b,some objects],[c,some objects]];


编辑用代码替换以解决新问题


这一个对我有用:

<?xml version="1.0" encoding="utf-8"?>
<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" minWidth="955" minHeight="600"
               >
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            private var a:ArrayCollection = new ArrayCollection([100,'y1','z1']);
            private var b:ArrayCollection = new ArrayCollection([200,'y2','z2']);
            private var c:ArrayCollection = new ArrayCollection([300,'y3','z3']);

            private var stepsObjs:ArrayCollection = new ArrayCollection([{ items: a},{ items: b},{ items: c}]);
            private var stepsColl:ArrayCollection = new ArrayCollection([[a],[b],[c]]);

        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout />
    </s:layout>
    <mx:DataGrid dataProvider="{stepsObjs}" >
        <mx:columns>
            <mx:DataGridColumn dataField="items.0" headerText="x" />
            <mx:DataGridColumn dataField="items.1" headerText="y" />
            <mx:DataGridColumn dataField="items.2" headerText="z" />
        </mx:columns>
    </mx:DataGrid>

    <mx:DataGrid dataProvider="{stepsColl}" >
        <mx:columns>
            <mx:DataGridColumn dataField="0.0" headerText="x" />
            <mx:DataGridColumn dataField="0.1" headerText="y" />
            <mx:DataGridColumn dataField="0.2" headerText="z" />
        </mx:columns>
    </mx:DataGrid>

</s:Application>

编辑用代码替换以解决新问题


这一个对我有用:

<?xml version="1.0" encoding="utf-8"?>
<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" minWidth="955" minHeight="600"
               >
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            private var a:ArrayCollection = new ArrayCollection([100,'y1','z1']);
            private var b:ArrayCollection = new ArrayCollection([200,'y2','z2']);
            private var c:ArrayCollection = new ArrayCollection([300,'y3','z3']);

            private var stepsObjs:ArrayCollection = new ArrayCollection([{ items: a},{ items: b},{ items: c}]);
            private var stepsColl:ArrayCollection = new ArrayCollection([[a],[b],[c]]);

        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout />
    </s:layout>
    <mx:DataGrid dataProvider="{stepsObjs}" >
        <mx:columns>
            <mx:DataGridColumn dataField="items.0" headerText="x" />
            <mx:DataGridColumn dataField="items.1" headerText="y" />
            <mx:DataGridColumn dataField="items.2" headerText="z" />
        </mx:columns>
    </mx:DataGrid>

    <mx:DataGrid dataProvider="{stepsColl}" >
        <mx:columns>
            <mx:DataGridColumn dataField="0.0" headerText="x" />
            <mx:DataGridColumn dataField="0.1" headerText="y" />
            <mx:DataGridColumn dataField="0.2" headerText="z" />
        </mx:columns>
    </mx:DataGrid>

</s:Application>

ItemRenders应该发送一个描述应该发生什么的事件,然后应该向上处理它

像这样:

//inside item renderer
dispatchEvent(new ItemEvent(ItemEvent.DELETE_ITEM, true, item));//where true tells the event to bubble (you'll need to create this event)

//somewhere above the DataGrid
dataGrid.addEventListener(ItemEvent.DELETE_ITEM, deleteItemFromSource);

protected function deleteItemFromSource(e:ItemEvent):void {
    var lcv:ListCollectionView = (dataGrid.dataProvider as ListCollectionView);
    lcv.removeItemAt(lcv.getItemIndex(e.item));
}
请注意,如果希望datagrid在更改时自动更新,而不是数组,则应使用某种ListCollectionView

HTH


Amy

ItemRenders应该发送一个描述应该发生什么的事件,然后应该向上处理它

像这样:

//inside item renderer
dispatchEvent(new ItemEvent(ItemEvent.DELETE_ITEM, true, item));//where true tells the event to bubble (you'll need to create this event)

//somewhere above the DataGrid
dataGrid.addEventListener(ItemEvent.DELETE_ITEM, deleteItemFromSource);

protected function deleteItemFromSource(e:ItemEvent):void {
    var lcv:ListCollectionView = (dataGrid.dataProvider as ListCollectionView);
    lcv.removeItemAt(lcv.getItemIndex(e.item));
}
请注意,如果希望datagrid在更改时自动更新,而不是数组,则应使用某种ListCollectionView

HTH


艾米

哦,我复制/粘贴错误,但我从来没有这样写过程序:)让我试着马上回复你。谢谢你的回复!我已经修改了我复杂的数据结构,你能帮我一下吗?谢谢!哦,它是否支持数据域中的“.”符号,我不知道。非常感谢@杰考:非常感谢。在多次尝试之后,我决定问您这个问题,我还有最后一个问题,我可以知道如何使用存储在arraycollection中的对象填充相同的对象吗。例如,私有变量o1:Object=newobject();o1={items:a};步骤。添加项(o1)@Anah我刚刚发布了一个示例,其中有
dataField=“items.0”
oops我复制/粘贴错误,但我从未以这种方式编写程序:)让我尝试一下,并尽快回复您。谢谢您的回复!我已经修改了我复杂的数据结构,你能帮我一下吗?谢谢!哦,它是否支持数据域中的“.”符号,我不知道。非常感谢@杰考:非常感谢。在多次尝试之后,我决定问您这个问题,我还有最后一个问题,我可以知道如何使用存储在arraycollection中的对象填充相同的对象吗。例如,私有变量o1:Object=newobject();o1={items:a};步骤。添加项(o1)@另外,我刚刚发布了一个带有
dataField=“items.0”
Rite的示例,我只使用ArrayCollection,但我的数据甚至比我发布的更复杂(这是一个摘要)。我认为,如果可以使用一个级别渲染嵌套数组,那么也可以使用多个嵌套数组。我将根据精确的数据结构编辑我的问题。您不能使用[thing1,thing2,thing3]创建ArrayCollection。最接近您的是new ArrayCollection([thing1,thing2,thing3])。所以我认为你误解了数据类型,这就是为什么你的视图没有更新的很大一部分原因。这就是为了解释这一点,实际上我对数据类型没有任何混淆,因为我想用更简单的方式来回答这个问题,所以我没有给出完全限定的语法。然而,这也是我的错误,从下一次开始,我将给出完整的描述。Jacob解决方案可行,现在我也将尝试使用您的方法。谢谢你的时间。我只使用ArrayCollection,但我的数据甚至比我发布的更复杂(这是一个摘要)。我认为,如果可以使用一个级别渲染嵌套数组,那么也可以使用多个嵌套数组。我将根据精确的数据结构编辑我的问题。您不能使用[thing1,thing2,thing3]创建ArrayCollection。最接近您的是new ArrayCollection([thing1,thing2,thing3])。所以我认为你误解了数据类型,这就是为什么你的视图没有更新的很大一部分原因。这就是为了解释这一点,实际上我对数据类型没有任何混淆,因为我想用更简单的方式来回答这个问题,所以我没有给出完全限定的语法。然而,这也是我的错误,从下一次开始,我将给出完整的描述。Jacob解决方案可行,现在我也将尝试使用您的方法。谢谢你抽出时间。