我使用setInterval每5秒轮询一次RemoteObject,返回的结果(Array)作为DataProvider被送入DataGrid。但是,每次发生这种情况时,所选行将在刷新DataGrid时取消选择。所以我想在更新DataGrid时重新选择项目。
到目前为止,我已尝试在使用以下方法调用RemoteObject之前捕获所选行:
private function refreshDataGrid(e:ResultEvent):void
{
var selectedRow:Object = myDataGrid.selectedItem;
myDataGrid.dataProvider = e.result as Array;
myDataGrid.selectedItem = selectedRow;
}
然而,这不起作用。如果我选择行然后执行“trace(myDataGrid.selectedItem)”,则控制台中的结果为空。
我尝试了另一次尝试:
private function refreshDataGrid(e:ResultEvent):void
{
var selectedItem:* = myDataGrid.selectedItem.itemId;
myDataGrid.dataProvider = e.result as Array;
myDataGrid.selectedItem.itemId = selectedItem;
}
这也不起作用。
任何人都可以帮我做这项工作吗?任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
您的对象看起来有一个唯一的itemId属性。第二次尝试的问题是它试图在当前选择的项目上设置itemId,而不是将当前选择的项目更改为具有该itemId的项目。我将更改第二个版本以循环访问dataProvider并找到具有指定itemId的项目,然后将该项目设置为所选项目。像这样:
private function refreshDataGrid(e:ResultEvent):void
{
var selectedItem:* = myDataGrid.selectedItem.itemId;
myDataGrid.dataProvider = e.result as Array;
for (var i:int = 0; i < myDataGrid.dataProvider.length; i++) {
if (myDataGrid.dataProvider[i].itemId == selectedItem) {
myDataGrid.selectedItem = myDataGrid.dataProvider[i];
break;
}
}
}
答案 1 :(得分:2)
更好的方法是让对象实现IUID接口,这是Flex List控件用来确定对象是否匹配的。
如果最新民意调查中的项目与旧版本的IUID相同,则仍会选中该项目。 http://livedocs.adobe.com/flex/3/html/help.html?content=about_dataproviders_8.html