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

Другие вопросы по тегам