2010-04-06 48 views
3

我有一个DataGrid,我将DataProvider设置为我的数据。当我的数据发生变化时,DataGrid会丢失选定的行,滚动条跳回顶部。我如何保持选择和滚动位置?如何在数据更改时维护DataGrid中的选择?

+0

您是否希望保持所选位置,即使所选项目改变了?或者你是否想维护选定的项目,即使它处于新的位置? – invertedSpear 2010-04-06 15:46:56

回答

8

如果你只是想保持仓位:

在任何

功能改变数据,第一个捕捉到选定的指数

var myidx:int = new int(myDG.selectedIndex); 

和滚动位置

var myVertPos:int = new int(myDG.verticalScrollPosition); 

运行代码改变数据,然后向上进行倒退:

myDG.selectedIndex = myidx; 
myDG.verticalScrollPosition = myVertPos; 

哦,你可能会想做一个检查,以确保所选择的索引不会超过DG中现在项目的长度,并选择最后一个。根据我的经验,设置大于最大值的垂直滚动位置只会导致滚动到最大值。

+0

如果新的dataProvider将selectedItem放入不同的索引中,这可能会如何工作? – Robusto 2010-04-06 16:25:28

+0

它不..这就是为什么我试图问OP的意图(维护项目,或维护索引)我想你可能可以通过使用'var myItem:Object = myDG'来维护该项目。 selectedItem;'和'myDG.selectedItem = myItem;'但我不知道如何在没有大量测试的情况下解决这个问题。然后,您需要以某种方式找到滚动位置......维护该项目要复杂得多:-) – invertedSpear 2010-04-06 17:40:43

+0

由于我列表中的项目数量没有变化,因此这似乎工作得很好,只是关联的数据。谢谢。 – 2010-04-06 18:15:43

2

有一种方法。您需要扩展DataGrid类并添加一个String属性uniqueIdField。

将uniqueIdField的值设置为数据集中唯一对象的属性。

然后覆盖设置的dataProvider方法如下: 这将工作,如果列没有排序。修复* 我现在遇到这样的问题,即当列对正确的行高亮进行排序,但滚动条不会变为该值(因为它影响排序的属性之一已更改)。 *

下面的代码将滚动条设置到正确的位置。

覆盖公共功能设置的dataProvider(值:对象):无效 { VAR VSCROLL:= 0; //检查是否我们重新选择先前选择的项目 //如果(uniqueIdField.length> 0 & &将selectedItem!= NULL)保存当前现在的位置是 { uniqueIdData = this.selectedItem [uniqueIdField]; vScroll = this.verticalScrollPosition; }

super.dataProvider = value;

 if(uniqueIdField.length > 0 
     && uniqueIdData != null 
     && selectedItems.length <= 1) 

{
变种currentObj:对象; var found:Boolean = false;

if(dataProvider is ArrayCollection) 
{ 

//find object in dataprovider 
for(var i:int=0; i < dataProvider.length; i++) 
{ 
    currentObj = dataProvider.getItemAt(i); 
    if(currentObj[uniqueIdField] == uniqueIdData) 
    { 
    this.selectedItem = currentObj; 
    found = true; 
    vScroll = this.selectedIndex; 
    break; 

    } 
} 

if(!found) 
{ 
    this.selectedItem = null; 
    uniqueIdData = null; 
} 


} 

//通知该项目已经被选择,发现或空 this.verticalScrollPosition = VSCROLL; dispatchEvent(new ListEvent(ListEvent。更改));

}

相关问题