【发布时间】:2010-04-06 15:37:19
【问题描述】:
我有一个 DataGrid,我将 DataProvider 设置为我的数据。当我的数据更改时,DataGrid 会丢失选定的行,并且滚动条会跳回顶部。如何保持选择和滚动位置?
【问题讨论】:
-
即使选择的项目发生变化,您是否希望保持选择的位置?或者您想保留所选项目,即使它位于新位置?
标签: apache-flex datagrid
我有一个 DataGrid,我将 DataProvider 设置为我的数据。当我的数据更改时,DataGrid 会丢失选定的行,并且滚动条会跳回顶部。如何保持选择和滚动位置?
【问题讨论】:
标签: apache-flex datagrid
如果你只是想保持位置:
在任何改变数据的函数中,首先捕获选定的索引
var myidx:int = new int(myDG.selectedIndex);
和滚动位置
var myVertPos:int = new int(myDG.verticalScrollPosition);
运行更改数据的代码,然后向后执行上述步骤:
myDG.selectedIndex = myidx;
myDG.verticalScrollPosition = myVertPos;
哦,您可能需要检查以确保所选索引不超过 DG 中现在项目的长度,如果是,请选择最后一个。根据我的经验,将垂直滚动位置设置为大于最大值只会导致滚动到最大值。
【讨论】:
myDG.selectedItem = myItem; 但我不确定如果没有大量测试我将如何解决这个问题。然后你需要以某种方式找到滚动位置......维护项目要复杂得多:-)
有办法。您需要扩展 DataGrid 类并添加一个字符串属性 uniqueIdField。
将 uniqueIdField 的值设置为数据集中对象的唯一属性。
然后重写 set dataProvider 方法,如下所示: 如果未对列进行排序,这将起作用。已修复*我现在遇到的问题是,当对列进行排序时,正确的行高亮显示,但滚动条没有移动到该值(因为其影响排序的属性之一已更改)。 *
下面的代码将滚动条设置到正确的位置。
覆盖公共函数集 dataProvider(value:Object):void { var vScroll:int = 0; //检查我们是否重新选择了之前选择的项目 //并保存当前位置 if(uniqueIdField.length > 0 && selectedItem != null) { uniqueIdData = this.selectedItem[uniqueIdField]; vScroll = this.verticalScrollPosition; }
super.dataProvider = 值;
if(uniqueIdField.length > 0
&& uniqueIdData != null
&& selectedItems.length <= 1)
{
var currentObj:对象;
var found:Boolean = false;
if(dataProvider is ArrayCollection)
{
//find object in dataprovider
for(var i:int=0; i < dataProvider.length; i++)
{
currentObj = dataProvider.getItemAt(i);
if(currentObj[uniqueIdField] == uniqueIdData)
{
this.selectedItem = currentObj;
found = true;
vScroll = this.selectedIndex;
break;
}
}
if(!found)
{
this.selectedItem = null;
uniqueIdData = null;
}
}
//通知该项目已被选中、找到或为空 this.verticalScrollPosition = vScroll; dispatchEvent(new ListEvent(ListEvent.CHANGE));
}
【讨论】: