如何数据绑定DataGrid组件而不向上滚动?

时间:2009-11-28 09:55:47

标签: flex data-binding datagrid scrollbar

我有一个DataGrid组件,我想每5秒更新一次。当行被添加到此DataGrid时,我注意到每次更新都会导致它将滚动条位置重置为顶部。如何设置将滚动条保持在之前的位置?

4 个答案:

答案 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 articleDataGrid写了一个小扩展课程。它看起来很棒。

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(向下滚动以阅读此内容)

相关问题