【发布时间】:2009-11-28 09:55:46
【问题描述】:
我有一个 DataGrid 组件,我想每 5 秒更新一次。在将行添加到此 DataGrid 时,我注意到每次更新都会将滚动条位置重置为顶部。如何使滚动条保持在之前的位置?
【问题讨论】:
-
谢谢!您的代码帮助我将 3 个不同的数据网格滚动条同步到同一行。保存了我的数据...
标签: apache-flex data-binding datagrid scrollbar
我有一个 DataGrid 组件,我想每 5 秒更新一次。在将行添加到此 DataGrid 时,我注意到每次更新都会将滚动条位置重置为顶部。如何使滚动条保持在之前的位置?
【问题讨论】:
标签: apache-flex data-binding datagrid scrollbar
创建一个变量来存储您最后的滚动位置并使用它。
大概是这样的:
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;
}
这不是最好的代码,但它说明了这一点,每当有人完成滚动事件时,您将最后一个位置存储在一个变量中,并在添加新数据后立即使用它来恢复滚动位置。
【讨论】:
我在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;
}
}
【讨论】:
我没有测试过这段代码,但它应该可以工作:
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);
【讨论】:
这些可能会有所帮助:
Maintain Scroll Position after Asynchronous Postback
Maintaining Scroll Position on Postback(向下滚动以阅读此内容)
【讨论】: