Как обновить значение данных в jqgrid
Я пытаюсь обновить ячейку в jqgrid навсегда после загрузки. Я знаю, что могу использовать setCell
, но это только обновляет значение для этой страницы. Если я вернусь на страницу, если я не выполняю явное выполнение другого setCell
для ячейки, отображается старое значение. Я также попробовал setRowData, но, похоже, он делает то же самое. Я использую loadonce
, так как мой подход заключается в 1) загрузка данных. 2) изменение нескольких значений данных на основе некоторых критериев. 3) отображение измененных значений. Как я использую loadonce
, не должно быть способа постоянно изменять ячейку в этом сеансе?
UPDATE:
Вводя мой код, который не дает ошибку, но не выполняет итерацию по всем данным:
var set = 0;
....
gridComplete: function(data){
setData();
},
....
beforeRefresh: function(data){
set = 0;
},
....
function setData(){
if(set == 1) return;
... //create hash up here
var dataArray = jQuery("#grid").jqGrid('getGridParam', 'data');
var j = 1;
for (var rows in dataArray) {
var key = dataArray[rows].name;
dataArray[rows].level = hashTable[key];
j++;
}
alert(j);
}
Это не циклическое перемещение по всем элементам массива, которые локально загружаются. Например, если размер страницы равен 30, alert(j)
возвращает 30, несмотря на то, сколько мест я загрузил локально. Однако, если я обновляю график, j является правильным числом. Почему поведение getGridParam отличается в каждом случае?
Ответы
Ответ 1
Если вы используете loadonce: true
, вы должны знать , где локальные данные будут храниться jqGrid. jqGrid имеет два варианта: data
и _index
. data
- это массив элементов, где каждый элемент имеет свойство name как свойство name
столбцов из colModel
. Если вам нужно найти элемент по id (rowid), вы можете использовать _index[rowid]
для элемента с помощью rowid в массиве data
. Чтобы изменить данные в столбце 'myColumn'
, вы должны сделать следующее:
// first change the cell in the visible part of grid
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue);
// now change the internal local data
var dataArray = myGrid.jqGrid('getGridParam', 'data'),
indexes = myGrid.jqGrid('getGridParam', '_index');
dataArray[indexes[rowid]].myColumn = newValue;
ОБНОВЛЕНО. Вы можете использовать документированный метод getLocalRow для изменения локальных данных:
// first change the cell in the visible part of grid
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue);
// now change the internal local data
myGrid.jqGrid('getLocalRow', rowid).myColumn = newValue;
Ответ 2
Для всех, кто пришел сюда из Google, вот обновленный ответ!
Важным является индекс, который вы можете получить, вызвав метод getInd-Method. Потому что rowID!= Индекс localRowData. (выражение rowId: jqg204, Index: 5)
EDIT:, если установить "ключ: истина" в colmodel, вы можете установить свой собственный rowId (отличный от моего примера "jqg ###", обычно PK из таблицы базы данных)
var ind = myGrid.getInd(rowId);
var localRowData = myGrid.jqGrid('getLocalRow', ind);
localRowData.myColumn = newValue;
надеюсь, что это поможет!
Ответ 3
У меня была аналогичная проблема:
Мне нужно было обновить строку при некотором действии пользователя (не имеет значения).
Для этого мне нужно было знать точную строку из объекта data, даже после некоторой фильтрации таблицы.
Поэтому я нашел способ определить, какая строка была изменена - я добавил свойство RowID для каждого элемента объекта data в событии loadComplete:
loadComplete: function () {
if (firstRun) {
firstRun = false;
var dataArray = $('#jqGrid').jqGrid('getGridParam', 'data');
$(dataArray).each(function (index) {
dataArray[index].RowID = index + 1;
});
}
}
И теперь, в коде форматирования, я смог получить доступ к rData.RowID, чтобы определить точную строку, на которой было предпринято действие, и получить/установить его представление данных