GWT 2.4 DataGrid автоматическая прокрутка при выборе элемента - PullRequest
7 голосов
/ 28 сентября 2011

Я использую новый GWT 2.4 DataGrid в проекте. Я настроил DataGrid с размером страницы 50.
Доступный экран недостаточно велик для отображения всех элементов, поэтому отображается вертикальная полоса прокрутки (на самом деле это основная цель использования DataGrid в первую очередь).
Я прикрепил SingleSelectionModel к сетке данных, чтобы иметь возможность выбирать элементы.
Это работает отлично до сих пор.

Однако у меня также есть другой виджет, с которым пользователь может взаимодействовать. На основании этого действия пользователя должен быть выбран элемент из DataGrid .
Иногда выбранный элемент не находится в видимой области экрана, и пользователь должен прокрутить вниз в DataGrid, чтобы увидеть его.
Есть ли способ автоматической или ручной прокрутки вниз, чтобы выбранный элемент был виден?
Я проверил JavaDocs DataGrid и не нашел подходящего метода или функции для этого.

Ответы [ 6 ]

9 голосов
/ 28 сентября 2011

Не знаю, работает ли это, но вы можете попытаться получить элемент строки для выделения и использовать метод scrollIntoView.

Пример кода:

dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();
6 голосов
/ 18 февраля 2012

Ответ выше работает довольно хорошо, хотя, если сетка шире вашего окна и имеет горизонтальную полосу прокрутки, она также прокручивается вправо, что довольно раздражает.Мне удалось заставить его прокручиваться вниз и оставаться прокручиваемым влево, получая первую ячейку в выбранной строке и затем прокручивая ее в поле зрения.

dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();
2 голосов
/ 28 сентября 2011

У меня нет времени, чтобы попробовать это, но DataGrid реализует интерфейс HasRows, а HasRows имеет, среди прочего, метод setVisibleRange. Вам просто нужно выяснить номер строки элемента, на котором вы хотите сфокусироваться, а затем установить видимый диапазон от этого числа n до n + 50. Таким образом, DataGrid будет сброшен, чтобы поместить этот элемент вверху (или около верха, если он находится в последних 50 элементах списка, поддерживающих DataGrid). Не забудьте перерисовать вашу DataGrid.

Вы уже смотрели на это? Если так, я был бы удивлен, что это не сработало.

О, и так как это один виджет, говорящий с другим, у вас, вероятно, есть настроенный обмен сообщениями и некоторые обработчики сообщений, так что когда пользователь взаимодействует с этим вторым виджетом и «выбирает» элемент, сообщение запускается на EventBus и обработчик этого сообщения исправляет DataGrid в соответствии с тем, что я описал. Я думаю, тебе придется сделать это самостоятельно.

1 голос
/ 22 августа 2013

Я получил исключение Out of bounds при выполнении вышеописанного.

Я решил, что получил ScrollPanel в DataGrid, и использовал .scrollToTop () и так далее в ScrollPanel.Однако для доступа к ScrollPanel в DataGrid мне пришлось использовать этот комментарий: http://code.google.com/p/google-web-toolkit/issues/detail?id=6865

1 голос
/ 23 ноября 2012

Мое решение, немного лучше:

dataGrid.getRow(model).scrollIntoView();
0 голосов
/ 12 февраля 2016

Как указал Кем, это раздражает эффект "scrollToRight" после scrollIntoView.После меня решение Кема дает лучшее поведение, чем базовое, так как обычно первые столбцы таблицы являются более значимыми.Я немного улучшил его подход, который прокручивает по горизонтали до первого столбца строки, которую мы хотим видеть, путем вычисления первого видимого столбца слева перед применением прокрутки и затем прокрутки к нему.

Последнее замечание: абсолютные левые столбцы проверяются на "51".Это значение я нашел «экспериментально», посмотрев значения JS в инструменте разработчика браузера. Я думаю, что это зависит от стиля таблицы, вам может потребоваться изменить / рассчитать его.

Ниже кода:

public void scrollIntoView(T next) {
        int index = datagrid.getVisibleItems().indexOf(next);
        NodeList<TableCellElement> cells = datagrid.getRowElement(index).getCells();
        int firstVisibleIndex = -1;
        for(int i=0; i<cells.getLength() && firstVisibleIndex<0;i++)
            if(UIObject.isVisible(cells.getItem(i)) && (cells.getItem(i).getAbsoluteLeft() > 51) && (cells.getItem(i).getAbsoluteTop() > 0))
                firstVisibleIndex = i;

        cells.getItem(firstVisibleIndex>=0? firstVisibleIndex : 0).scrollIntoView();
}
...