2011-11-11 69 views
0

我有一個ArrayCollection作爲DataProvider的Datagrid,arrayCollection部分由remoteObject調用生成,數據提供者似乎至少工作,直到我嘗試編輯字段...DataGrid與ArrayCollection作爲DataProvider的奇怪行爲

通過該RemoteObject我只收到一個ArrayCollection與現場ip,但數據網格查找領域ipchecksave ... 如果我只有特定條件

下添加/編輯這個它工作的新領域,但數據網格:

<s:DataGrid id="datagrid" left="10" right="10" top="136" 
      dataProvider="{listaIPCheck}" bottom="10" requestedRowCount="4"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="ip" headerText="Asset"/> 
      <s:GridColumn dataField="check" headerText="Inventory"/> 
      <s:GridColumn dataField="save" headerText="Salvataggio"/> 
     </s:ArrayList> 
    </s:columns> 
</s:DataGrid> 

腳本:

[Bindable]private var listaIPCheck:ArrayCollection; 

private function ro_resultHandler(event:Event=null):void 
{ 
    listaIPCheck = new ArrayCollection(); 
    listaIPCheck = ro.getListUpdate.lastResult; 
    heap = 0;   
    // Read Below {POINT #1} 
    init3(); 
} 

private function init3():void 
{ 
// Read Below {POINT #2} 
if (heap<listaIPCheck.length) 
{ 
    // omitted the initialization of the process p 
    p.addEventListener(NativeProcessExitEvent.EXIT, onExit); 
    try{       
     p.start(startupInfo); 
    }catch(e:Error){} 
} 
} 


private function onExit(e:NativeProcessExitEvent):void {  
    // Read below {POINT #3} 
} 

這裏是我的代碼,現在你可以看到有3行,其中我寫了下面的閱讀... 假設把這個簡單的for代替註釋行(一次在一個時間)

for (var k:Number=0;k<listaIPCheck.length;k++) 
{ 
    listaIPCheck.getItemAt(k).check = "checkVal"; 
    listaIPCheck.getItemAt(k).save = "saveVal"; 
} 

該代碼始終在3分工作,所以在通話中的ArrayCollection總是充滿着新的價值觀的結束,但數據網格ONL刷新項目y在點#1#2 爲什麼不在Point #3 ???

+1

你爲什麼要省略p的初始化過程?它是什麼?由於DataGrid不可編輯,您如何編輯該字段?你在編輯什麼字段?當你說代碼不起作用時;有什麼問題?它怎麼不工作?你有運行時錯誤嗎?或者你看到意外的行爲? – JeffryHouser

+0

我省略了P的初始化過程,因爲它與問題無關......在POINT 1-2-3中使用'for'替代地工作並正確更新/添加指定的值,問題是如果我把在POINT 3中,ArrayCollection被編輯,但是數據網格中的更改不刷新,而點1-2更新(arrayCollection)和刷新(數據網格) – Marcx

回答

0

當您更改ArrayCollection中項目的屬性時,DataGrid不刷新的原因是因爲更改屬性不會觸發collectionChange事件。 DataGrid無法知道對象內的屬性發生了變化。它必須處理指針和內存空間,以及DataGrid正在尋找哪些綁定目的。在大多數情況下,invalidateList()方法強制刷新顯示。您可以調用集合上的refresh()方法或itemUpdated()方法或完全替換dataProvider以強制刷新。

+0

ok,但爲什麼它在POINT 1-2上工作,而不是POINT 3?我在之前設置了數據提供者,所以通過邏輯,我不應該在前兩個點看到刷新... – Marcx

+0

在點1;你正在設置dataProvider的變量「listaIPCheck = ro.getListUpdate.lastResult;」;這樣會觸發綁定,因爲listAIPCheck指向的內存位置已經改變。根據您提供的代碼,第2點與dataProvider或DataGrid沒有關係。這就是爲什麼我要求瞭解P如何初始化的信息。 – JeffryHouser

+0

P是一個外部進程,onExit是一個在進程結束時觸發的函數...在所有這三種情況下,arraycollection都會更新,但數據網格僅在前兩個版本中刷新! – Marcx