#jqgrid
#jqgrid
Вопрос:
У меня есть многовыборная jqGrid с многовыборной сеткой как подсетью. В onSelectRow
событии для родительской сетки, как я могу получить ссылку на дочернюю сетку?
По сути, мне нужно сделать следующее:
- Разверните подсетку (чтобы загрузить ее данные с сервера)
- Получить ссылку на эту подсетку
- С помощью ссылки выполните цикл по строкам и установите для каждой из них значение selected (Для строк, которые имеют собственную вложенную подсетку, это запустит их
onSelectRow
и повторит процесс. Не волнуйтесь, глубина сетки не превышает 3 вложений.)
Сегодня утром я просматривал различную документацию, но пока не обнаружил, что мне нужно, чтобы это произошло. Может быть, я просто упускаю очевидное? Или, может быть, для этого потребуется немного больше ума?
Я вижу, как можно выполнить шаг 3 выше, начиная с getRowData()
и просматривая результаты с помощью setSelection()
. Я использую их в другом месте кода, и они отлично работают. Но на данный момент я застрял на шагах 1 и 2 выше.
Редактировать: Следуя приведенному ниже ответу @Oleg, я немного подробнее рассмотрел синхронизацию усилий между onSelectRow
событием родительской сетки и subGridRowExpanded
event . Вот сокращенная версия того, что я тестирую прямо сейчас:
onSelectRow: function(id, status) {
// Automatically expand the sub-grid (to load the data) and select the rows in that grid
autoSelecting = true; // autoSelecting is a global variable normally set to false
$('#mainGrid').expandSubGridRow(id);
}
subGridRowExpanded: function(subgrid_id, row_id) {
//... build the sub-grid, works fine (an artifact of which is a subgrid_table_id)
// If this grid was auto-expanded to be auto-selected, select all its rows
if (autoSelecting) {
var sdata = $('#' subgrid_table_id).getRowData();
for (var i = 0; i < sdata.length; i ) {
$('#' subgrid_table_id).setSelection(sdata[i].Id);
}
autoSelecting = false;
}
}
Здесь происходит несколько вещей, пока я возлюсь с этим:
- Если я использую FireBug для отладки этого, выделения и подвыборки работают правильно. Однако, если я удалю точки останова и попробую это в режиме реального времени, подвыборки не произойдут. Подсетка расширяется, но ее строки не выделяются. Я полагаю, что где-то там проблема с синхронизацией.
- Я, очевидно, еще не учитывал каскадные отмены выбора.
- Если подсетка уже развернута, выбор не выполняется каскадно.
Ответ №1:
Внутри loadComplete
обработчика событий сетка загружена, и вы можете выполнить некоторые дополнительные действия, такие как расширение некоторых строк.
- Подсеть можно расширить с помощью метода expandSubGridRow.
- Чтобы получить ссылку на подсетку, подсетка должна быть создана первой. Итак, лучшее место для ссылки на сетку — это
subGridRowExpanded
событие. Вы не опубликовали код JavaScript, который используете, поэтому сложно описать все более точно. - Чтобы выбрать все строки, которые вы можете использовать
setSelection
в цикле или использовать код типа$('.cbox', myGrid[0]).trigger('click');
, есть разные другие варианты, как сделать то же самое. Если вы увидите, что здесь у вас узкое место в производительности, тогда я мог бы описать, как вы можете сделать этот шаг более эффективным.
Я могу повторить, что наиболее важно, чтобы вы развернули или выделили строки, после загрузки данных сетки (или данных подсети).
Комментарии:
1. Я думаю, что, возможно, я не очень хорошо передал свой подход, но, как всегда, вы определенно указали мне несколько полезных направлений. Я обновил вопрос, чтобы отразить некоторый код в моей доработке и текущее состояние поведения. Потребность в этой функциональности довольно низкая, учитывая, что подсетки сейчас успешно расширяются и по умолчанию имеют флажок «выбрать все» в углу, так что для меня это как бы отодвигается на второй план. Но, естественно, это продолжает оставаться праздным любопытством 🙂
2. @David: Мне кажется, вам лучше использовать
setSelection
внутриloadComplete
дочерней подсети, которую вы создаете и заполняетеsubGridRowExpanded
. Более того, для расширения / свертывания подсетокbeforeSelectRow
, вероятно, могло бы быть лучше, посколькуonSelectRow
. Я имею в виду случай отмены выбора ранее выбранной строки. Если вы опубликуете больше кода, который вы используете, я мог бы лучше понять, как вы могли бы решить свою проблему. Например, если вы используетеsubGridModel
вместо подсети в качестве сетки , все будет сложно.