Как обновить значение данных в jqgrid
Я пытаюсь обновить ячейку в jqgrid навсегда при загрузке. Я знаю, что могу использовать setCell
но это только обновляет значение для этой страницы. Если я вернусь на страницу, если я не буду явно выполнять другой setCell
для ячейки показано старое значение. Я также пробовал setRowData, но, похоже, делает то же самое. Я использую loadonce
мой подход заключается в том, чтобы: 1) загрузить данные 2) изменить несколько значений данных на основе некоторых критериев 3) показать измененные значения. Как я использую loadonce
не должен ли быть способ изменить ячейку навсегда в этом сеансе?
ОБНОВИТЬ:
Вставка в мой код, который не дает ошибку, но не может перебрать все данные:
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 отличается в каждом случае?
3 ответа
Если вы используете 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;
Для всех, кто пришел сюда из Google, вот обновленный ответ!
Важным является индекс, который вы можете получить, вызвав метод getInd-Method. Потому что rowID!= Индекс localRowData. (уравнение rowId: jqg204, индекс: 5)
РЕДАКТИРОВАТЬ: если установить "ключ: истина" в colmodel, вы можете установить свой собственный rowId (в отличие от моего примера "jqg###", обычно PK из таблицы базы данных)
var ind = myGrid.getInd(rowId);
var localRowData = myGrid.jqGrid('getLocalRow', ind);
localRowData.myColumn = newValue;
надеюсь, это поможет!
У меня была похожая проблема:
Мне нужно было обновить строку после определенного пользовательского действия (не имеет значения).
Для этого мне нужно было знать точную строку из объекта "данные", даже после некоторой фильтрации таблицы.
Поэтому я нашел способ определить, какая строка была изменена - я добавил свойство 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, чтобы идентифицировать точную строку, в которой было выполнено действие, и получить / установить его представление "данных".