我有一个带有ArrayCollection的Datagrid作为DataProvider,arrayCollection是由remoteObject调用部分生成的,dataprovider似乎至少工作,直到我尝试编辑该字段...
通过RemoteObject,我只收到一个字段为ip
的ArrayCollection,但datagrid会查找字段ip
,check
和save
...
如果我添加/编辑这个新字段,它可以工作,但只能在特定条件下
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
???
答案 0 :(得分:0)
更改ArrayCollection中项目的属性时DataGrid不刷新的原因是,因为更改属性不会触发collectionChange事件。 DataGrid无法知道对象中的属性发生了变化。它与指针和内存空间有关,以及DataGrid正在寻找什么用于绑定目的。
在大多数情况下,强制刷新显示的invalidateList()方法。您可以在集合上调用refresh()方法或itemUpdated()方法,或者完全替换dataProvider以强制刷新。