我有一个DataGrid组件,我想每5秒更新一次。当行被添加到此DataGrid时,我注意到每次更新都会导致它将滚动条位置重置为顶部。如何设置将滚动条保持在之前的位置?
答案 0 :(得分:1)
创建一个变量来存储你的最后一个滚动位置并使用它。
大致类似于:
var lastScroll:Number = 0;
private function creationCompleteHandler(event:FlexEvent):void{
stage.addEventListener(MouseEvent.MOUSE_UP, updateLastScroll);
}
private function updateLastScroll(event:MouseEvent):void{
lastScroll = myDataGrid.verticalScrollPosition
}
private function dataGridHandler(event:Event):void{
myDataGrid.verticalScrollPosition = lastScroll;
}
这不是最好的代码,但它说明了这一点,每当有人完成滚动事件时,您将最后一个位置存储在变量中,并在添加新数据后立即使用它来恢复滚动位置。
答案 1 :(得分:1)
我根据this article向DataGrid
写了一个小扩展课程。它看起来很棒。
public final class DataGridEx extends DataGrid
{
public var maintainScrollAfterDataBind:Boolean = true;
public function DataGridEx()
{
super();
}
override public function set dataProvider(value:Object):void {
var lastVerticalScrollPosition:int = this.verticalScrollPosition;
var lastHorizontalScrollPosition:int = this.horizontalScrollPosition;
super.dataProvider = value;
if(maintainScrollAfterDataBind) {
this.verticalScrollPosition = lastVerticalScrollPosition;
this.horizontalScrollPosition = lastHorizontalScrollPosition;
}
}
答案 2 :(得分:0)
我没有测试过这段代码,但它应该可以运行:
var r:IListItemRenderer;
var len:Number = dataGrid.dataProvider.length;
var i:Number;
//indexToItemRenderer returns null for items that are not visible
for(i = 0; i < len; i++)
{
r = dataGrid.indexToItemRenderer(i);
if(r)
break;
}
//now i contains the first visible item - store this in a variable
lastPos = i;
//update the dataprovider here.
//now scroll to the position
dataGrid.scrollToIndex(lastPos);
答案 3 :(得分:-1)
这些可能会有所帮助:
Maintain Scroll Position after Asynchronous Postback
Maintaining Scroll Position on Postback(向下滚动以阅读此内容)