2010-03-01 6 views
4

В моей ситуации мне нужно разрешить пользователям редактировать различные ячейки в сетке, а затем сохранить всю сетку на сервере позже. Я довольно сильно решил эту проблему с встроенным редактированием и сохранением в clientArray. Тем не менее, я пытаюсь использовать editRules и столкнулся с некоторыми проблемами.jqGrid - inline edit and trapping edit rules

Если я столбец редактируемые и использовать редактирования правила требуют, чтобы быть номером

{ name: 'Value', index: 'Value', width: 50, sortable: true,edittype: 'text', 
       editable: true, editoptions: { maxlength: 10 }, 
       editrules:{number: true}, 
       formatter:currencyFmatter, unformat:unformatCurrency }, 

и я контролирую редактирование и сохранение в onSelectRow события:

onSelectRow: function(id){ 
    if(id && id!==lastSel){ 
     jQuery("#Groups").saveRow(lastSel,true,'clientArray'); 
     jQuery("#Groups").editRow(id,true); 
    } 
    lastSel=id 
}, 

Я затем использовать событие нажатия кнопки для сохранения сетки. Все работает отлично до тех пор, пока я не добавлю числовое значение в ячейку Value, а затем нажмите на строку ниже. Он бросает предупреждение и останавливает сохранение, но это не мешает мне изменять строки. Поэтому у меня теперь есть две строки для редактирования. Есть ли способ уловить ошибку editrule, поэтому я могу обработать ее, прежде чем переходить к следующей строке.
Я попытался использовать функции с saveRow (succesfunc, aftersavefunc, errorfunc, afterrestorefunc), из которых все говорят, что огонь после сохранения данных на сервер, который, похоже, не работает для «clientArray».

В принципе, мне нужно найти способ проверки данных в встроенном редактировании при сохранении в «clientArray» и информации, предложениях, и, в частности, примеры были бы весьма полезными.

Спасибо.


После долгой игры я решил, что правила редактирования не работают так хорошо с редактированием inLine. Итак, как вы предположили, я сделал свою собственную процедуру проверки. Хитрость заключалась в том, чтобы понять, как получить значение отредактированной строки.

Единственное, что я пытаюсь выяснить сейчас, это то, как получить фокус, чтобы вернуться к столбцу Value. Вернемся к документации!

   if(id && id!==lastSel){ 
         //dont save if first click 
         if (lastSel != -1) { 
          //get val of Value to check 
          var chkval = jQuery("#"+lastSel+"_Value").val() ; 
          // verify it is a number 

          if (isNaN(chkval)) {//If not a number 
      //Send Validation message here 

           //Restore saved row 
           jQuery("#Grid").restoreRow(lastSel); 
           //Return to failed save row 
           jQuery("#Grid ").setSelection(lastSel,false); 
           //reopen for editing 
           jQuery("#Grid ").editRow(lastSel,true); 
           //Note - dont reset lastSel as you want to stay here } 
          else { 
          // If number is good, proceed to save and edit next 
           jQuery("#Grid ").jqGrid('saveRow',lastSel, checksave, 'clientArray', {}, null, myerrorfunc);   
           jQuery("#Grid ").editRow(id,true); 
           lastSel=id; 
           }; 
          isDirty = true; 
          }; 
         else { 
          //first click - open row for editing 
          alert("new Edit") 
          jQuery("#Grid ").editRow(id,true); 
          lastSel=id;} 
          } 

ответ

2

Чтобы позаботиться об этом вы можете написать свою собственную функцию проверки, myRowIsValid в приведенном ниже примере. Затем, просто вызовите эту функцию как часть вашего обработчика onSelectRow события:

onSelectRow: function(id){ 
    if(id && id!==lastSel){ 

    if (lastSel != null && !myRowIsValid(lastSel)) { 
     // Display validation error somehow 
     return; 
    } 

    jQuery("#Groups").saveRow(lastSel,true,'clientArray'); 
    jQuery("#Groups").editRow(id,true); 
    } 
    lastSel=id 
}, 

В принципе, если проверка не пройдена, то пусть пользователь знает и не вносить изменения в следующую строку.

+0

Спасибо, Джастин. Я попытался двигаться по этому пути, но не уверен, как получить данные из строки. Я попробовал jQuery ("# ​​rowid_myCol"). Val(), чтобы получить значение моего значения, но это не работает. Как получить значение Value, чтобы я мог его протестировать. --DW –

+0

OK, вам действительно нужно сначала вызвать saveRow(), чтобы вы могли правильно получить доступ к данным строки. Я должен прояснить это выше. Затем вы можете использовать getRowData() для получения данных для строки. Это помогает? –

+0

Если я вызову saveRow(), если не удалось отредактировать и не будет сохранен. Думаю, я был близок. Я считаю, что мне нужно использовать jQuery (#lastSel_myCol "). Val(). Я попал в неправильную строку. Если я получу это правильно, я отправлю его. –

4

, чтобы решить эту проблему, я использовал плагин jquery.limitkeypress.min.js.

onSelectRow: function(id){ 
       if(id && id!==lastsel){ 
        jQuery('#treegrid').jqGrid('restoreRow',lastsel); 
        jQuery('#treegrid').jqGrid('editRow',id, true); 
        $("input[name=Presupuesto]").limitkeypress({ rexp: /^[+]?\d*\.?\d*$/ }); 
        lastsel=id; 
       } 
      } 

где «Presupuesto» - это название столбца, в котором я предоставляю входные данные пользователю.

Это работает очень хорошо ...

1

Я сделал массив с именем edit_list, так и в обратном вызове oneditfunc я добавить ROWID в список, и на aftersavefunc я удалить его из списка.

Таким образом, вы можете проверить edit_list в обратных вызовах, чтобы определить, есть ли редактируемая строка.

0

Это решение, вероятно, не существовало, когда сначала спросил ОП, но именно так я решил его использовать, используя последнюю версию jqGrid (4.4.4).

Я использую тот факт, что saveRow вернет true/false при успешном завершении.

Надеюсь, это поможет.

function StartEditing($grd, id) { 
    var editparameters = { 
     "keys": true, 
     "url": 'clientArray' 
    }; 
    $grd.jqGrid('editRow', id, editparameters); 
    $grd[0].LastSel = id; 
} 

onSelectRow: function(id) { 
    var $grd = $(this); 
    if (id && !isNaN($grd[0].LastSel) && id !== $grd[0].LastSel) { 
     if ($grd.jqGrid('saveRow', $grd[0].LastSel, { "url": 'clientArray' })) 
      StartEditing($grd, id); 
     else 
      $grd.jqGrid('setSelection', $grd[0].LastSel); 
    } 
    else 
     StartEditing($grd, id); 
} 
0

Чтобы улавливать правила редактирования на saveRow случае, вы можете использовать встроенный тип возврата .Please знака «saveRow» в качестве ответа, если вы ищете этот yourcode: onSelectRow: function(id){ if(id && id!==lastSel){ jQuery("#Groups").saveRow(lastSel,true,'clientArray');
jQuery("#Groups").editRow(id,true); }
lastSel=id }

modify code:

 onSelectRow: function(id){ 
     if(id && id!==lastSel){ 
      var bool = jQuery("#Groups").saveRow(lastSel,true,'clientArray'); 

      //bool true -->success,false -->invalid row /req field validations 

     if(bool) 
     { 
      //Returns true on sucessful save of record i.e to grid (when using client array) 
      //and set current selected row to edit mode 
      jQuery("#Groups").editRow(id,true); 
     } 
     else 
     { 
      //Set last selected row in edit mode and add required values 
      jQuery("#Groups").editRow(lastSel,true); 
     } 

    } 
    lastSel=id 
    }