2010-03-01 80 views
4

在我的情況下,我需要允許用戶編輯網格中的各種單元格,然後將整個網格保存到服務器。我已經使用內聯編輯和保存到'clientArray'來解決這個問題。但是,我試圖使用editRules並遇到一些問題。jqGrid - 內聯編輯和陷印編輯規則

如果我使列可編輯,並使用編輯規則來要求它是一個數字

{ 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編輯中工作得很好。所以,如你所說,我做了我自己的驗證程序。訣竅是弄清楚如何獲得編輯行的值。

我現在想弄明白的一件事是如何讓焦點返回到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

謝謝,賈斯汀使用的「saveRow」。請標記內置的返回類型的答案。我試圖沿着這條路走,但不知道如何從行中獲取數據。我嘗試了jQuery(「#rowid_myCol」)。Val()來獲取我的值的值,但這不起作用。如何獲得Value的價值,以便我可以測試它。 --DW –

+0

好的,您實際上需要先調用saveRow(),以便您可以正確訪問行數據。我應該在上面闡明。然後你可以使用getRowData()來獲取行的數據。這有幫助嗎? –

+0

如果我調用saveRow()如果失敗了editrule並且不會被保存。我想我很接近。我相信我需要使用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

當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); 
} 
0

要在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 
    }