jqGrid - 内联编辑和陷印编辑规则

时间:2010-03-01 20:55:31

标签: 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;}
                            }  

5 个答案:

答案 0 :(得分: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 :(得分: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
},

基本上,如果验证失败,则让用户知道并且不要编辑下一行。

答案 2 :(得分:1)

我创建了一个名为edit_list的数组,并在回调oneditfunc中将rowid添加到列表中,并在aftersavefunc上将其从列表中删除。

通过这种方式,您可以检查回调中的edit_list,以确定是否有正在编辑的行。

答案 3 :(得分: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);
}

答案 4 :(得分:0)

要在saveRow事件中捕获编辑规则,您可以使用内置的返回类型' 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
    }

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 }