Ваш вопрос (и ваша проблема ) не прост.Поэтому я отвечаю с задержкой.
Прежде всего, вы должны включить в ваши данные уникальные значения id
, чтобы быть уверенными, что значения rowid останутся без изменений после сортировки данных.В качестве значений можно использовать любые уникальные значения, например, 1, 2, ..., 5 или 10, 20, ... 50 или любые другие значения.Я изменил входные данные из вашей демонстрации на следующее:
var data = [
{ id: 10, win: 50, draw: 20, defeat: 30 },
{ id: 20, win: 40, draw: 10, defeat: 50 },
{ id: 30, win: 30, draw: 50, defeat: 20 },
{ id: 40, win: 20, draw: 60, defeat: 20 },
{ id: 50, win: 70, draw: 20, defeat: 10 }
];
Следующая проблема: информация, которую вы сохраняете в параметре mySelection
.Ваша текущая реализация сохраняет массив объектов со следующими свойствами: rowId
, cellId
, columnName
, cellValue
и selectedCell
, где selectedCell
- это элемент DOM, который представляет выбранный элемент <td>
.Я считаю нехорошим сохранение selectedCell
, поскольку содержимое сетки будет перестроить после сортировки, а selectedCell
будет указывать на элемент DOM удаленный со страницы HTML.Кроме того, вы просматриваете элементы в mySelection
по rowid (см. Код функции returnExistingRowSelectedCells
).Код можно сократить до одной строки, если вы измените информацию, сохраненную в mySelection
, на карту: имя столбца по rowid.Например, если вы выберете 3 ячейки в сетке, как показано на рисунке ниже
, то текущая реализация будет содержать mySelection
, как
[{
"rowId": "20",
"selectedCell": {...},
"cellId": "20_draw",
"columnName": "draw",
"cellValue": 10
}, {
"rowId": "40",
"selectedCell": {...},
"cellId": "40_win",
"columnName": "win",
"cellValue": 20
}, {
"rowId": "30",
"selectedCell": {...},
"cellId": "30_defeat",
"columnName": "defeat",
"cellValue": 20
}]
(в исходной демоверсии rowId
были такие значения, как "jqg4"
, "jqg2"
и "jqg3"
).Я предлагаю заменить массив на объект наподобие
{
"20": "draw",
"40": "win",
"30": "defeat"
}
Я использую имена столбцов вместо индексов столбцов, чтобы быть уверенным, что не нужно обновлять данные, если порядок столбцов будет изменен путем перетаскивания.& отбрасывать заголовки столбцов (необходимо добавить к демонстрации jquery-ui.min.js
причины, чтобы сделать опцию sortable: true
, которую вы используете работоспособной).
Последнее замечание касается адресации ячеек по имени столбца.Свободный jqGrid содержит внутренний параметр iColByName
, который позволяет получить индекс столбца по имени столбца (gridParams.iColByName[colName]
).Кроме того, метод getGridRowById
можно использовать для получения <tr>
по rowid, а затем один фургон использует $.jgrid.getCell
для получения оболочки jQuery в ячейку (<td>
) по индексу столбца:
var tr = $(this).jqGrid("getGridRowById", rowid);
var $td = $jgrid.getCell.call(this, tr, iCol); // mostly $(tr.cells[iCol]);
Inтак, как вам нужно, просто держать rowid и имя столбца и получить $td
с информацией.Затем вы можете использовать $td.addClass("ui-state-highlight")
или $td.removeClass("ui-state-highlight")
для выбора / отмены выбора ячейки.
Модифицированный код может выглядеть следующим образом:
mySelection: {},
loadComplete: function() {
var $this = jQuery(this), gridParams = $this.jqGrid("getGridParam"),
selectedCells = gridParams.mySelection, rowId, tr, iCol, $td;
for (rowId in selectedCells) {
if (selectedCells.hasOwnProperty(rowId)) {
tr = $this.jqGrid("getGridRowById", rowId);
iCol = gridParams.iColByName[selectedCells[rowId]];
$td = jQuery.jgrid.getCell.call(this, tr, iCol);
$td.addClass("ui-state-highlight");
}
}
},
onCellSelect: function(rowId, iCol, cellContent, element) {
var $this = jQuery(this),
gridParams = $this.jqGrid("getGridParam"),
selectedCells = gridParams.mySelection;
if (selectedCells[rowId]) {
// some sell is already selected in the row
var tr = $this.jqGrid("getGridRowById", rowId),
iColSelected = gridParams.iColByName[selectedCells[rowId]],
$tdSelected = jQuery.jgrid.getCell.call(this, tr, iColSelected);
$tdSelected.removeClass("ui-state-highlight");
if (gridParams.iColByName[selectedCells[rowId]] === iCol) {
// the current cell will be unselected
delete selectedCells[rowId];
return;
}
}
// select the cell
jQuery(element.target).closest("td").addClass("ui-state-highlight");
// update column name in mySelection
selectedCells[rowId] = gridParams.colModel[iCol].name;
},
beforeSelectRow: function(rowId, element) {
return false;
},
См. Модифицированную демонстрацию https://jsfiddle.net/OlegKi/hwondp71/37/.