这与其他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声明已添加
答案 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”发布的代码。它可能是一种更好,更轻的性能方法。