使用ArrayCollection作为DataProvider的DataGrid上的奇怪行为

时间:2011-11-11 09:54:09

标签: actionscript-3 flex arraycollection dataprovider

我有一个带有ArrayCollection的Datagrid作为DataProvider,arrayCollection是由remoteObject调用部分生成的,dataprovider似乎至少工作,直到我尝试编辑该字段...

通过RemoteObject,我只收到一个字段为ip的ArrayCollection,但datagrid会查找字段ipchecksave ... 如果我添加/编辑这个新字段,它可以工作,但只能在特定条件下

DataGrid:

<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始终使用新值填充,但datagrid仅在#1#2点刷新项目 为什么不在Point #3 ???

1 个答案:

答案 0 :(得分:0)

更改ArrayCollection中项目的属性时DataGrid不刷新的原因是,因为更改属性不会触发collectionChange事件。 DataGrid无法知道对象中的属性发生了变化。它与指针和内存空间有关,以及DataGrid正在寻找什么用于绑定目的。

在大多数情况下,强制刷新显示的invalidateList()方法。您可以在集合上调用refresh()方法或itemUpdated()方法,或者完全替换dataProvider以强制刷新。