Как обновить значение данных в 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, чтобы определить точную строку, на которой было предпринято действие, и получить/установить его представление данных