2016-06-22 4 views
0

Ich verwende jqGrid Version 4.6.0Prevent ROWIDs von Zurücksetzen auf Sortierung, Paging oder Löschen von Zeilen

Meine Frage die gleiche wie This Question ist.

Die dort angenommene Lösung ist der Primärschlüssel, aber ich habe keinen Primärschlüssel für meine Zeilen. Gibt es eine Möglichkeit, jqgrid beim Sortieren, Ändern von Seiten oder Löschen von Zeilen zu eindeutigen Zeilen-IDs zu zwingen?

Das Problem, das ich habe, ist, wenn ich eine sagen Zeile 2 aus einem Raster mit 5 Zeilen löschen die Zeile für 3 ist auf 2, Zeile4 bis 3 ... etc. Ich möchte, dass meine Zeilen eindeutige IDs sind, und ich möchte, dass diese auf der Clientseite generiert werden.

Weitere Informationen: Mein Grid ist clientseitig ausgelagert und sortiert.

Hier ist ein JsFiddle Link zu den Beispieldaten meines Rasters.

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

Typischer Grund für Ihr Problem: Sie ** füllten ** die Daten auf die falsche Weise, ohne die eindeutige ID jedes Eingabedatenelements anzugeben. Sie sollten den Text Ihrer Frage an ein Beispiel der Daten anhängen, die Sie zum Füllen des Gitters verwenden (2-3 Zeilen wären ausreichend) und an den JavaScript-Code, mit dem Sie jqGrid erstellen. Darüber hinaus ist es wichtig zu wissen, welche Version von jqGrid Sie verwenden und von welcher Abzweigung von jqGrid ([freies jqGrid] (https://github.com/free-jqgrid/jqGrid), kommerzielles [Guriddo jqGrid JS] (http: // guriddo .net /? page_id = 103334) oder ein altes jqGrid in Version <= 4.7) – Oleg

+0

@Oleg Ich habe gerade meine Frage mit einem Link zu jsfiddle und Beispielcode bearbeitet. Der Grund, warum ich keinen Primärschlüssel habe, liegt darin, dass mein Zeilenschlüssel ein zusammengesetzter Schlüssel ist, so dass ich in keiner der Spalten key: true setzen kann. Denken Sie daran, dies ist ein Beispiel, das ich für diese Frage erstellt habe, meine echte ist so kompliziert und die Daten werden in MVC erstellt. –

+0

Jede Zeile von jqGrid ** muss ** ein eindeutiges ID-Attribut haben (siehe [das Bild] (https://free-jqgrid.github.io/getting-started/index.html#grid-internal)). ** Welcher ** zusammengesetzter Schlüssel ist einzigartig in den Daten? Warum verwenden Sie 'index: 'id'' für die Spalte mit' name:' meterid''? Sie können für jedes Element von Eingabedaten eine 'id'-Eigenschaft erstellen. Die aktuellen Eingabedaten sind nicht so gut, da alle anderen Eigenschaften mit der Ausnahme "meterid" ** editierbar sind **. Es ist sehr schlecht editierbare ID zu haben. Verwenden Sie 'datentyp: 'xml'' in Ihrer ursprünglichen Demo? Verfügen Sie über systemeigene XML-Daten oder serialisieren Sie die Daten als XML anstelle von JSON? – Oleg

Antwort

1

Sie können als Wert des Datenparameter

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

vor der Verwendung von mydata hinzufügen. Es sollte dein Hauptproblem beheben. Wenn Sie die Daten vom Server laden, können Sie die ID auf der Serverseite zuweisen oder beforeProcessing Callback verwenden, um die vom Server zurückgegebenen Daten zu ändern, bevor die Daten von jqGrid verarbeitet werden.

Verwandte Themen