jqGrid - правила редактирования inline и trapping - PullRequest
4 голосов
/ 01 марта 2010

В моей ситуации мне нужно разрешить пользователям редактировать различные ячейки в сетке, а затем сохранять всю сетку на сервере позже. Я в значительной степени решил эту проблему с помощью встроенного редактирования и сохранения в «clientArray». Однако я пытаюсь использовать editRules и столкнулся с некоторыми проблемами.

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

{ 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. Итак, как вы предложили, я сделал свою собственную процедуру проверки. Хитрость заключалась в том, чтобы выяснить, как получить значение отредактированной строки.

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

              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;}
                            }  

Ответы [ 5 ]

4 голосов
/ 20 октября 2010

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

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

2 голосов
/ 02 марта 2010

Чтобы позаботиться об этом, вы можете кодировать свою собственную функцию проверки, 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
},

Обычно, если проверка не пройдена, сообщите об этом пользователю и не редактируйте следующую строку.

1 голос
/ 02 июля 2011

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

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

0 голосов
/ 05 августа 2015

Чтобы перехватить правила редактирования для события saveRow, вы можете использовать встроенный возвращаемый тип 'saveRow'. Пожалуйста, отметьте ответ, если вы ищете это <strong>yourcode</strong>: onSelectRow: function(id){ if(id && id!==lastSel){ jQuery("#Groups").saveRow(lastSel,true,'clientArray');<br> jQuery("#Groups").editRow(id,true); }<br> lastSel=id }</p> <p><strong>modify code:</strong></p> <pre><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 }

0 голосов
/ 03 мая 2013

Это решение, вероятно, не существовало, когда OP впервые спросил, но я решил это, используя последнюю версию 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...