当数据发生变化时,如何在DataGrid中维护选择?

时间:2010-04-06 15:37:19

标签: flex datagrid

我有一个DataGrid,我将DataProvider设置为我的数据。当我的数据更改时,DataGrid会丢失所选行,并且滚动条会跳回到顶部。如何保持选择和滚动位置?

2 个答案:

答案 0 :(得分:8)

如果你只想保持位置:

在改变数据的任何函数中,首先捕获所选索引

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

和滚动位置

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

运行更改数据的代码,然后执行上述步骤:

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

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

答案 1 :(得分:2)

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

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

然后覆盖set dataProvider方法,如下所示: 如果未对列进行排序,这将起作用。 FIXED * 我现在遇到的问题是,在对列进行排序时,正确的行高亮但滚动条没有达到该值(因为影响排序的其中一个属性已更改)。 *

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

  

覆盖公共函数集dataProvider(value:Object):void     {   var vScroll:int = 0;      //检查我们是否重新选择了之前选择的项目      //并保存当前位置      if(uniqueIdField.length> 0&& selectedItem!= null)      {       uniqueIdData = this.selectedItem [uniqueIdField];       vScroll = this.verticalScrollPosition;      }

super.dataProvider = value;

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

{
    var currentObj:Object;     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;
 }


}

//通知该项已被选中,找到或为null    this.verticalScrollPosition = vScroll;    dispatchEvent(new ListEvent(ListEvent.CHANGE));

}