jqGrid - встроенное редактирование и захват правил редактирования

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

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

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

Спасибо.


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

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

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

person DW.    schedule 01.03.2010    source источник


Ответы (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» - это имя столбца, в который я позволяю вводить данные пользователю.

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

person Christian Tacle    schedule 20.10.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
},

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

person Justin Ethier    schedule 01.03.2010
comment
Спасибо, Джастин. Я пытался двигаться по этому пути, но не знаю, как получить данные из строки. Я попробовал jQuery (#rowid_myCol) .Val (), чтобы получить значение моего значения, но это не работает. Как получить значение Value и протестировать его. --DW - person DW.; 02.03.2010
comment
Хорошо, вам действительно нужно сначала вызвать saveRow (), чтобы вы могли правильно получить доступ к данным строки. Я должен пояснить это выше. Затем вы можете использовать getRowData () для получения данных для строки. Это поможет? - person Justin Ethier; 02.03.2010
comment
Если я вызываю saveRow (), если правило редактирования не выполняется и не сохраняется. Думаю, я был близок. Я считаю, что мне нужно использовать jQuery (#lastSel_myCol) .val (). Я попал не в тот ряд. Если у меня все получится, я отправлю это. - person DW.; 02.03.2010
comment
@ Джастин Этье: что такое clientArray? а как можно получить доступ к данным clientArray ??? Благодарность - person Pouya; 03.09.2012
comment
Согласно документам jqGrid: url: if defined, this parameter replaces the editurl parameter from the options array. If set to 'clientArray', the data is not posted to the server but rather is saved only to the grid (presumably for later manual saving).. Таким образом, он не сохраняется в другой массив или что-то еще - вам нужно отслеживать изменения на стороне клиента, если вы хотите отправить их позже. Это просто не позволяет сетке автоматически размещать их. - person Justin Ethier; 04.09.2012
comment
@JustinEthier: спасибо, я искал только это решение. - person Meraj; 27.02.2013
comment
@DW попробуйте это, чтобы получить значение ячейки: var rowData = jQuery (this) .getRowData (rowid); значение переменной = rowData ['colname']; - person buzibuzi; 05.11.2013

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

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

person Brandon    schedule 02.07.2011

Этого решения, вероятно, не существовало, когда 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);
}
person user1689571    schedule 03.05.2013