Ссылка на подсеть в onSelectRow?

#jqgrid

#jqgrid

Вопрос:

У меня есть многовыборная jqGrid с многовыборной сеткой как подсетью. В onSelectRow событии для родительской сетки, как я могу получить ссылку на дочернюю сетку?

По сути, мне нужно сделать следующее:

  1. Разверните подсетку (чтобы загрузить ее данные с сервера)
  2. Получить ссылку на эту подсетку
  3. С помощью ссылки выполните цикл по строкам и установите для каждой из них значение 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 вместо подсети в качестве сетки , все будет сложно.