Как сохранить выбор в DataGrid при изменении данных? - PullRequest
3 голосов
/ 06 апреля 2010

У меня есть DataGrid, и я устанавливаю DataProvider для моих данных. Когда мои данные изменяются, DataGrid теряет выбранную строку, и полоса прокрутки возвращается наверх. Как сохранить выбор и положение прокрутки?

Ответы [ 2 ]

8 голосов
/ 06 апреля 2010

Если вы просто хотите сохранить позицию:

в какой бы функции функция не изменяла данные, сначала запишите выбранный индекс

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

и положение прокрутки

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

запустите код, который изменяет данные, затем выполните описанные выше шаги в обратном направлении:

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

Да, и вы, вероятно, захотите проверить, чтобы убедиться, что выбранный индекс не превышает длину элементов в вашей DG, и выберите последний, если он есть. По моему опыту установка вертикальной позиции прокрутки больше максимальной приводит к прокрутке до максимальной.

2 голосов
/ 06 октября 2010

Есть способ.вам нужно расширить класс DataGrid и добавить свойство String uniqueIdField.

Установить для поля uniqueIdField свойство уникальных объектов в наборе данных.

, а затем переопределить метод set dataProviderкак показано ниже: это будет работать, если столбцы не отсортированы.ИСПРАВЛЕНО * У меня теперь проблема в том, что при сортировке столбца отображаются правильные выделения строк, но полоса прокрутки не соответствует значению (поскольку одно из его свойств, влияющих на сортировку, изменилось). *

Приведенный ниже код устанавливает полосу прокрутки в правильное положение.

переопределить набор открытых функций dataProvider (значение: 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;
 }


}

// уведомить, что элемент был выбран, найден или обнулен this.verticalScrollPosition = vScroll;dispatchEvent (новый ListEvent (ListEvent.CHANGE));

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...