代码之家  ›  专栏  ›  技术社区  ›  Roland Rabien

当数据更改时,如何在数据报中维护所选内容?

  •  3
  • Roland Rabien  · 技术社区  · 14 年前

    我有一个数据报,我将数据提供程序设置为我的数据。当我的数据更改时,数据报将丢失选定的行,滚动条将跳回到顶部。如何保持选择和滚动位置?

    2 回复  |  直到 14 年前
        1
  •  8
  •   invertedSpear    14 年前

    如果你只想保持位置:

    在任何函数更改数据时,首先捕获所选索引

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

    以及滚动位置

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

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

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

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

        2
  •  2
  •   David    14 年前

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

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

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

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

    重写公共函数集DataProvider(值:对象):void { var-vscroll:int=0; //检查是否重新选择上一个选定项 //并保存当前位置 如果(uniqueidfield.length>0&selectedItem!=空) { uniqueiddata=this.selecteditem[唯一字段]; vscroll=此。垂直滚动位置; }

    super.dataProvider=值;

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

    {
    var currentobj:对象; 找到var: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));

    }

    推荐文章