2009-10-02 61 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」作爲發佈的代碼。它可能是一種更好,更輕的性能方法。