ArrayCollection对象到字符串 - “for each”循环的问题

时间:2009-10-02 22:45:51

标签: flex flex3

这与其他question有关。但别介意。我已经修好了部分内容。

我有一个DataGrid,它的数据提供程序是一个ArrayCollection,我希望它将其中的所有itens(Object Type)解析为String。

为此我已经完成了“for each”循环,它设法获取Object及其值,但是如果我有更多的那个对象它只获取最后一个对象,不知道为什么。


首先,我将展示如何将这些项添加到ArrayCollection中,这样您就可以轻松理解其余项。

在主应用程序中,我有ArrayCollection:

<mx:ArrayCollection id="collection">

然后在其他组件中有一个添加项目菜单,当您添加项目时:

private function fazerEncomenda():void
{
    var novoitem:Object;
    novoitem = new Object();
    novoitem.id = "consumivel"+getProdInfo.lastResult.consumivel.id;
    novoitem.tinteiroid = getProdInfo.lastResult.consumivel.id;
    novoitem.label = getProdInfo.lastResult.consumivel.nome;
    novoitem.ref = getProdInfo.lastResult.consumivel.refmarca;
    novoitem.marca = getProdInfo.lastResult.consumivel.marca;
    novoitem.genero = genero.text;
    novoitem.quantidade = quantidade.text;
    Application.application.collection.addItem(novoitem);
}

然后在另一个组件中将DataGrid作为其dataProvider绑定到ArrayCollection

<mx:DataGrid id="compras" x="0" y="0" width="556" dataProvider="{Application.application.collection}" editable="false">
        <mx:columns>
            <mx:DataGridColumn headerText="ID" dataField="tinteiroid" visible="false"/>
            <mx:DataGridColumn headerText="Nome" dataField="label" width="120" />
            <mx:DataGridColumn headerText="Ref" dataField="ref" width="100"/>
            <mx:DataGridColumn headerText="Marca" dataField="marca" width="100"/>
            <mx:DataGridColumn headerText="Género" dataField="genero" width="155"/>
            <mx:DataGridColumn headerText="Quantidade" dataField="quantidade" width="81"/>
        </mx:columns>
    </mx:DataGrid>

当按下按钮时,该函数将所有对象及其值转换为字符串。

在这个函数中,它只能获取ArrayCollection中的最后一项。

for each (novoitem in compras.dataProvider)
{
    finish += "TinteiroID:"+novoitem.tinteiroid+"#TinteiroLABEL:"+novoitem.label+"#TinteiroREF:"+novoitem.ref+"#TinteiroMARCA:"+novoitem.marca+"#TinteiroGENERO:"+novoitem.genero+"#TinteiroQUANTIDADE:"+novoitem.quantidade+"#FIMPROD#";
    trace(finish);
}

当然,函数中使用的Vars:

private var finish:String;
private var novoitem:Object

正如你在finish中看到的那样,我使用了+=,所以它将自己和下一个对象添加起来。相反,他添加了null。如果之前有3个项目,则只有一个空事件。

不知道这个循环的问题是什么。

请帮助。我在这里失去了理智。

PS:对不起任何不好的英语,这是3个小时。没有进展。

编辑:缺少Vars声明已添加

4 个答案:

答案 0 :(得分:1)

您是否尝试过数组集合的“.source”属性?我不确定for-each循环是否适用于ArrayCollection对象。

如,

for each(novoitem in compras.dataProvider.source) { ... }

答案 1 :(得分:1)

您是否尝试过使用常规for循环

for (var i:int = 0; i < compras.dataProvider.length; i++) {

novoitem= compras.dataProvider[i];
trace(novoitem); // will output to the console during debugging. 
...
}

在任何情况下你都不应该循环使用你应该在Application.application.collection上循环的dataProvider

答案 2 :(得分:1)

执行所有这些操作的更简单方法(无论如何不使用您指定的标签)只是使用ActionScript内置的ObjectUtil.toString方法。

你会写这样的东西:

import mx.utils.ObjectUtil;

public function dumpObj():void {
    myTextField.text = ObjectUtil.toString(obj);
 }

这应该打印出你拥有的每个多重/嵌套对象的每个属性。

但是 - 如果您希望它可以重复使用,则应对组件进行根本性更改。你的收藏需要一个getter / setter。在组件中,添加以下代码:

[Bindable]
private var _myCollection:ArrayCollection;

public function set myCollection (data:ArrayCollection) : void {
    _myCollection = data;
}

public function get myCollection () : ArrayCollection {
    return _myCollection;
}

还有其他几种方法可以做到这一点 - 如果你需要不同的东西,请查阅它。 在您的数据网格中,使用像这样的私有ArrayCollection变量:

<mx:DataGrid id="compras" x="0" y="0" width="556" dataProvider="{_myCollection}" editable="false">
    <mx:columns>
            <mx:DataGridColumn headerText="ID" dataField="tinteiroid" visible="false"/>
...

在主应用程序中,您可以像这样填充组件:

<kgtm:myComponent x="0" y="20" myCollection="{queryDataAC}"

你将ArrayCollection命名为:

<mx:ArrayCollection id="queryDataAC">

在顶级应用程序代码中,您定义了kgtm命名空间,因此您可以使用自定义组件,如下所示:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:kgtm="com.kgtm.*"

然后将您的组件放在与此命名空间定义对应的文件夹中。

这一切都导致最终的对象打印实用程序 - 您在组件上定义,因为它是唯一应该知道如何打印出它的数据。

定义一个公共函数,并使用ObjectUtil或您自己的方法打印出私有的ArrayCollection数据。

public var getLastQueryOutput():String {

private var output:String = "";
private var len:int = _myCollection.length;
for (var i:int = 0; i <len; i++)   {
    output = output + 
    "TinteiroID:"+_myCollection[i].tinteiroid+
    "#TinteiroLABEL:"+_myCollection[i].label+
    "#TinteiroREF:"+_myCollection[i].ref+
    "#TinteiroMARCA:"+_myCollection[i].marca+
    "#TinteiroGENERO:"+_myCollection[i].genero+
    "#TinteiroQUANTIDADE:"+_myCollection[i].quantidade+
    "#FIMPROD#";

}
trace(output);

}

希望这会有所帮助。如果在将对象放入ArrayCollection时正确命名对象,则可以再次使用我在顶部所述的ObjectUtil。

Casp - 查看更多我(及其同事)的博客文章here

答案 3 :(得分:0)

伙计们,我真的要感谢你。

感谢你的努力格伦和安德鲁我做到了。再次感谢。

现在我将发布代码,以便有类似问题的人可以得到一些帮助。

下面是代码,以获取ArrayCollection中每个对象的Objects和Itens。

[Bindable]
private var finish:String = "";
private var novoitem:Object
for (var i:int = 0; i <Application.application.collection.length; i++)
{
 novoitem = compras.dataProvider[i];
 finish = finish + "TinteiroID:"+novoitem.tinteiroid+"#TinteiroLABEL:"+novoitem.label+"#TinteiroREF:"+novoitem.ref+"#TinteiroMARCA:"+novoitem.marca+"#TinteiroGENERO:"+novoitem.genero+"#TinteiroQUANTIDADE:"+novoitem.quantidade+"#FIMPROD#";
 trace(finish);          
}

再次感谢。我想把你的两个芒果都正确,但它们并不完全。所以我把这两个结合起来了。在这里。

我将以正确的方式签署这个答案,但这一点归功于你的全部。如果没有你的帮助我就不会这样做。

修改 这是我用过的代码,但是看看“CaspNZ”发布的代码。它可能是一种更好,更轻的性能方法。