Как привязать данные к компоненту DataGrid без прокрутки вверх? - PullRequest
1 голос
/ 28 ноября 2009

У меня есть компонент DataGrid, который я хотел бы обновлять каждые 5 секунд. Поскольку строки добавляются в эту DataGrid, я заметил, что каждое обновление заставляет ее сбрасывать положение полосы прокрутки наверх. Как мне сохранить полосу прокрутки на прежнем месте?

Ответы [ 4 ]

1 голос
/ 28 ноября 2009

Я написал небольшой класс расширения для 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;
        }
}   
1 голос
/ 28 ноября 2009

сделать переменную для хранения вашей последней позиции прокрутки и использовать ее.

примерно что-то вроде:

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;
}

Это не лучший код, но он иллюстрирует смысл: всякий раз, когда кто-то заканчивает событие прокрутки, вы сохраняете последнюю позицию в переменной и используете ее для восстановления позиции прокрутки сразу после добавления новых данных.

0 голосов
/ 28 ноября 2009

Я не тестировал этот код, но он должен работать:

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);
0 голосов
/ 28 ноября 2009
...