2009-10-02 58 views
0

这与其他question有关。但没关系。我已经修复了它的一部分。我有一个DataGrid,它的数据提供者是一个ArrayCollection,我希望它将所有itens(Object Type)解析为一个String。因为我为每个循环做了一个“设置”,它设法获取对象及其值,但是如果我有更多的那个对象,它只会得到最后一个对象,不知道为什么。ArrayCollection对象字符串 - “每个”循环的问题


首先,我将展示如何将这些项目添加到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作为其数据提供者绑定到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> 

而当一个Butt on被按下的函数将所有对象及其值赋给一个String。

而在这个函数中,它只在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); 
} 

当然在函数中使用的变量和加:

private var finish:String; 
private var novoitem:Object 

当您在完成VAR我用+=看到那么它增加了它的自我和下一个对象。相反,他增加了null。如果之前有3个项目,则只有一个空事件。

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

请帮忙。我在这里放松心情。

PS:对不起,任何不好的英语,它已经在这3小时。并没有进展。

编辑:缺少瓦尔宣言新增

回答

1

一个更简单的方法来做这一切(当然不是与你指定的标签)是只使用ActionScript内置的ObjectUtil.toString方法。

你会写这样的事:

​​

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

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

[Bindable] 
private var _myCollection:ArrayCollection; 

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

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

还有其他几种方法可以做到这一点 - 看它,如果你需要不同的东西。 在你的DataGrid,这样使用私有的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数据。

公共变种getLastQueryOutput():字符串{

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

+0

这看起来和我所做的一样,我没有发布所有的代码,不要阻止你们帮助我。这增加了将.mxml文件中的集合绑定到另一个mxml文件和组件之间的过程。毫无疑问,你的工作也会如此。 – 2009-10-04 21:38:19

+0

PS:这就是为什么我只包括我的代码只是给你们,有一个更好的理解。它的工作方式。我有很多帮助。再次感谢你们所有人。 – 2009-10-04 21:39:47

+0

很高兴为您解决这一切:-) – 2009-10-04 22:20:05

1

您是否尝试过你的阵列收集的“.source”属性?我不确定是否每个循环都在ArrayCollection对象上工作。

例如,

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

是的,我已经尽力了,忘了提及。同样的结果。 – 2009-10-02 23:12:31

+0

尝试在循环之前将数据提供者分配给临时ArrayCollection变量。确认大小。然后将ac.source分配给另一个变量。确认大小。尝试缩小问题发生的位置。 – Glenn 2009-10-02 23:17:50

1

你试图在你不应该对你在前人的精力在应用程序可以循环dataProvider中循环任何情况下,只需使用常规的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.collection

+0

compras.dataProvider.length不起作用,但Application.application.collection.length工作得很好。 – 2009-10-03 13:05:20

0

伙计们,我真的很想谢谢你。

感谢您的努力Glenn和AndrewB我做到了。再次感谢。

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

这里的代码是获取ArrayCollection中每个对象的对象和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);   
} 

再次感谢。我想把你们的两把awnser放在正确的位置,但它们并不完全。所以我把这两个代码结合起来。在这里。

我将签署这个答案是正确的,但信用它的所有你的。如果没有你的帮助,我不会完成它。

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