Проблема перехода к строке на панели сетки

Я использую Extjs 4.2. У меня есть панель сетки с> 1000 строк, и на ней включен множественный выбор.

Когда я нажимаю кнопку, я хочу выбрать и перейти к строке 20, используя следующее:

grid.getSelectionModel().select(20, false, true);
grid.getView().getNode(20).scrollIntoView();

Это отлично работает, если я нахожусь рядом с 20-й строкой, но в противном случае он правильно выбирает 20-ю строку, но не переходит к 20-й строке, и я получаю сообщение об ошибке: TypeError: grid.getView(...).getNode(...) is undefined

Любая помощь очень ценится.


person Mulvihic    schedule 03.12.2013    source источник
comment
Вставьте свой код на jsfiddle.net.   -  person Just code    schedule 03.12.2013
comment
Используете ли вы буферизованный рендеринг для вашей сетки? А какая именно версия Ext4.2?   -  person rixo    schedule 03.12.2013
comment
Я использую 4.2.2. Я использую буферизованный рендеринг — это проблема?   -  person Mulvihic    schedule 04.12.2013
comment
Спасибо Rixo за вопрос о буферизованном рендеринге — моя сетка использует это, и я смог найти пример, который показал мне, как перейти к строке за пределами моих буферизованных строк — мой ответ ниже.   -  person Mulvihic    schedule 04.12.2013


Ответы (3)


Rixo указал мне правильный путь, спрашивая о буферизованных сетках.

Я нашел этот пример, в котором есть все: http://docs.sencha.com/extjs/4.2.0/extjs-build/examples/grid/buffer-grid.html

Это строка, которая позволяет мне перейти к строке 20:

grid.view.bufferedRenderer.scrollTo(20, true);
person Mulvihic    schedule 04.12.2013
comment
В версии 6.5 рекомендуется использовать метод sureVisible сетки. docs.sencha.com/extjs/ 6.5.0/классический/ - person Tonis F. Piip; 13.09.2017

Проблема в том, что такого Node нет, когда вы находитесь далеко от него, так как GridView просто не уничтожает HTML-элемент из-за проблем с производительностью. Вы можете использовать gridView.focusNode(record ) вместо этого:

var record = gridView.getStore().getById(20);
gridView.focusNode(record);

И после этого фокуса выберите запись:

grid.getSelectionModel().select(record);
person Andrei I    schedule 03.12.2013
comment
Я использовал 'grid.getView().focusRow(20)' и 'grid.getView().focusNode(20);' с тем же результатом - он не будет прокручиваться, если я буду больше, чем страница и немного отойду. Единственная разница в том, что я не получаю ошибку. Я использую это неправильно? - person Mulvihic; 03.12.2013
comment
Метод focusNode() ожидает запись, а не число. Смотрите мой обновленный ответ. - person Andrei I; 03.12.2013
comment
Попробуйте наоборот: сначала focusNode, а затем выберите его. - person Andrei I; 03.12.2013
comment
Я получил запись, которую выбрал, а затем попытался сфокусировать ее: grid.getSelectionModel().select(20, false, true); запись var = grid.getSelectionModel().getSelection()[0]; grid.getView().focusNode(record);‹/code› Это дало мне ту же проблему, что и раньше. Также я использовал задержку для focusRow: 'grid.getSelectionModel().select(20, false, true); grid.getView().focusRow(20, 100);' Но та же проблема - person Mulvihic; 03.12.2013
comment
Привет, Андрей, я поставил getSelectionModel до и после того, как получил строку, и никакой радости. - person Mulvihic; 03.12.2013

Сначала выберите свою запись, используя:

var rec = grid.store.findRecord('id',rowId);

Выберите запись с помощью:

grid.getSelectionModel().select(  rec  );

Сфокусируйте запись, используя:

grid.getView().focusRow(  ); 
person Kishan Reddy    schedule 03.12.2013
comment
Кажется, нет никаких проблем с выбором строки. Проблема, с которой я сталкиваюсь, связана с прокруткой до рассматриваемой строки. focusRow(20) не работает, когда я нахожусь больше, чем на странице и немного далеко. То же самое и с focusNode(rec) - person Mulvihic; 03.12.2013
comment
После выбора записи grid.getView().focusRow(); автоматически сфокусирует выбранную запись. - person Kishan Reddy; 03.12.2013