【问题标题】:How do I maintain selection in a DataGrid when the data changes?数据更改时如何维护 DataGrid 中的选择?
【发布时间】:2010-04-06 15:37:19
【问题描述】:

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

【问题讨论】:

  • 即使选择的项目发生变化,您是否希望保持选择的位置?或者您想保留所选项目,即使它位于新位置?

标签: apache-flex datagrid


【解决方案1】:

如果你只是想保持位置:

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

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

和滚动位置

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

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

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

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

【讨论】:

  • 如果新的 dataProvider 将 selectedItem 放在不同的索引中,它可能会如何工作?
  • 它没有..这就是为什么我试图询问 OP 的意图(维护项目或维护索引)我认为你可以通过使用类似 @ 的东西来让它维护项目987654324@ 和 myDG.selectedItem = myItem; 但我不确定如果没有大量测试我将如何解决这个问题。然后你需要以某种方式找到滚动位置......维护项目要复杂得多:-)
  • 这似乎工作得很好,因为我列表中的项目数量没有改变,只是相关的数据。谢谢。
  • 数据(例如,从数据库中获取的数据)是否可以更改,这不是重点。我发现最好的事情是保持 selectedId 变量与选择同步,然后在数据源上挂起一个更改观察程序,并通过遍历所有行来重置选择。 TODO:如何保证 change wachter 仅在 网格中的数据刷新后运行,因此可能有更好的方法
  • invertedSpear:这是行不通的,因为 AS3 的一大缺点是不能重载和在用户定义的类上使用 equals 方法(如在 Java 或任何其他体面的语言中)。 selectedItem = myItem 将不起作用,因为 flex 比较对象的引用(重新加载后已更改)
【解决方案2】:

有办法。您需要扩展 DataGrid 类并添加一个字符串属性 uniqueIdField。

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

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

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

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

super.dataProvider = 值;

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

{
var 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.CHANGE));

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2011-11-10
    • 2013-11-02
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多