我有一个DataGrid,我将DataProvider设置为我的数据。当我的数据更改时,DataGrid会丢失所选行,并且滚动条会跳回到顶部。如何保持选择和滚动位置?
答案 0 :(得分:8)
如果你只想保持位置:
在改变数据的任何函数中,首先捕获所选索引
var myidx:int = new int(myDG.selectedIndex);
和滚动位置
var myVertPos:int = new int(myDG.verticalScrollPosition);
运行更改数据的代码,然后执行上述步骤:
myDG.selectedIndex = myidx;
myDG.verticalScrollPosition = myVertPos;
哦,您可能需要检查以确保所选索引的长度不超过DG中现在的项目长度,如果是,则选择最后一个。根据我的经验,设置垂直滚动位置大于最大值只会导致滚动到最大值
答案 1 :(得分:2)
有一种方法。您需要扩展DataGrid类并添加String属性uniqueIdField。
将uniqueIdField的值设置为数据集中唯一的对象的属性。
然后覆盖set dataProvider方法,如下所示: 如果未对列进行排序,这将起作用。 FIXED * 我现在遇到的问题是,在对列进行排序时,正确的行高亮但滚动条没有达到该值(因为影响排序的其中一个属性已更改)。 * 强>
下面的代码将滚动条设置为正确的位置。
覆盖公共函数集dataProvider(value:Object):void { var vScroll:int = 0; //检查我们是否重新选择了之前选择的项目 //并保存当前位置 if(uniqueIdField.length> 0&& selectedItem!= null) { uniqueIdData = this.selectedItem [uniqueIdField]; vScroll = this.verticalScrollPosition; }
super.dataProvider = value;
if(uniqueIdField.length > 0
&& uniqueIdData != null
&& selectedItems.length <= 1)
{
var currentObj:Object;
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;
}
}
//通知该项已被选中,找到或为null this.verticalScrollPosition = vScroll; dispatchEvent(new ListEvent(ListEvent.CHANGE));
}