Como componente DataGrid dados de ligação sem rolagem para cima?
-
06-07-2019 - |
Pergunta
Eu tenho um componente DataGrid que eu gostaria de atualizar a cada 5 segundos. Como linhas estão sendo adicionados a esta DataGrid notei que cada atualização faz com que ele para redefinir a posição da barra de rolagem até o topo. Como posso gerir a manter a barra de rolagem na sua posição anterior?
Solução 2
Eu escrevi uma pequena classe de extensão para DataGrid
baseado em este artigo . Parece ótimo trabalho.
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;
}
}
Outras dicas
fazer uma variável para armazenar a sua última posição de rolagem e usar isso.
aproximadamente algo como:
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;
}
Não é o melhor código, mas ilustra o ponto, sempre que alguém termina o evento de rolagem, você armazenar última posição em uma variável e você usá-lo para restaurar o direito posição de rolagem depois que você adicionou novos dados.
Eu não testei este código, mas ele deve funcionar:
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);
Estes podem ajudar:
Manter Scroll Posição após Asynchronous postback
Manter Scroll posição sobre Postback (Scroll mais abaixo para ler este)