2016-06-22 3 views
0

Я использую jqGrid версии 4.6.0Предотвращение ROWIDs от сброса по сортировке, пейджинг или удаление строк

Мой вопрос такой же, как This Question.

Решение, принятое там, должно использовать первичный ключ, но у меня нет первичного ключа для моих строк. Есть ли способ заставить jqgrid иметь уникальные идентификаторы строк при сортировке, изменении страниц или удалении строк?

Проблема у меня есть, если я удаляю строку say 2 из сеток с 5 строками, rowid для 3 устанавливается в 2, row4 - 3 ... и т. Д. Я хочу, чтобы мои строки были уникальными идентификаторами, и я хочу, чтобы они были сгенерированы на стороне клиента.

Для получения дополнительной информации: Моя сетка выгружается и сортируется на стороне клиента.

Вот ссылка JsFiddle на пример данных моей сетки.

testRow = function() 
{ 
    var row2correct = $("#list").jqGrid('getRowData', 2);// {meterid:2, DocGroupName: "name2", DocList: "list2", Mandatory: "No"}; 

    var row6wong = $("#list").jqGrid('getRowData', 6);// is empty but i was expecting {meterid:4, DocGroupName: "name6", DocList: "ggg", Mandatory: "Yes"} 

} 
      var mydata = [ 
        {meterid:1 , metername: "name1", DocList: "list1", Mandatory: "Yes"}, 
        {meterid:2, metername: "name2", DocList: "list2", Mandatory: "No"}, 
        {meterid:1, metername: "name3", DocList: "list3", Mandatory: "No"}, 
        {meterid:3, metername: "name4", DocList: "list4", Mandatory: "Yes"}, 
        {meterid:4, metername: "name5", DocList: "list5", Mandatory: "Yes"}, 
         {meterid:4, metername: "name6", DocList: "ggg", Mandatory: "Yes"}, 
       ]; 
      $("#list").jqGrid({ 
       datatype: "local", 
       data: mydata, 
       height: "auto", 
       colNames: ['Meterid', 'metername','Document Name','No of Mandatory'], 
       colModel :[ 
        {name:'meterid', index:'meterid', width:55}, 
        {name:'metername', index:'metername', width:90}, 
        {name:'DocList', index:'DocList', width:90, editable: true },     {name:'Mandatory', index:'Mandatory', width:90, editable: true}     
       ], 
       pager: '#pager', 
       rowNum:4, 
       rowList:[4,8,30], 
       sortorder: 'asc', 
       viewrecords: true, 
       gridview: true 
      }); 
+0

Типичная причина вашей проблемы: вы ** заполнили ** данные неверным образом, не указав уникальный идентификатор каждого элемента входных данных. Вы должны добавить текст своего вопроса с примером данных, которые вы используете для заполнения сетки (достаточно 2-3 строк) и кода JavaScript, который вы используете для создания jqGrid. Кроме того, важно знать, какую версию jqGrid вы используете и из какой вики jqGrid ([free jqGrid] (https://github.com/free-jqgrid/jqGrid), коммерческий [Guriddo jqGrid JS] (http: // guriddo .net /? page_id = 103334) или старый jqGrid в версии <= 4.7) – Oleg

+0

@Oleg Я только что редактировал свой вопрос со ссылкой на jsfiddle и пример кода. Причина, по которой у меня нет первичного ключа, состоит в том, что ключ моих строк - это составной ключ, поэтому я не могу установить ключ: true в любом из столбцов. Имейте в виду, что это образец, который я создал для этого вопроса, мой реальный настолько сложный, и данные создаются в mvc. –

+0

Каждая строка jqGrid ** должна иметь уникальный атрибут id (см. [Рисунок] (https://free-jqgrid.github.io/getting-started/index.html#grid-internal)). ** Какой ** составной ключ уникален в данных? Почему вы используете 'index: 'id'' для столбца с именем:' meterid''? Вы можете создать свойство 'id' для каждого элемента входных данных. Текущие входные данные не так хороши, потому что все остальные свойства с исключением 'meterid' ** редактируются **. Очень плохо иметь редактируемый идентификатор. Вы используете 'datatype: 'xml'' в своей оригинальной демонстрации? У вас есть собственные данные XML или вы сериализуете данные как XML вместо JSON? – Oleg

ответ

1

Вы можете добавить

var i, l = mydata.length, item; 
for (i = 0; i < l; i++) { 
    item = mydata[i]; 
    item.id = String(item.meterid) + "_" + item.metername; 
} 

Перед использованием mydata в качестве значения параметра данных. Это должно решить вашу основную проблему. Если вы загружаете данные с сервера, вы можете назначить идентификатор на стороне сервера или использовать обратный вызов beforeProcessing для изменения данных, возвращаемых с сервера, прежде чем данные будут обработаны jqGrid.

Смежные вопросы