成功内联更新/内联创建记录后,jqgrid重新加载网格

时间:2010-01-21 14:07:36

标签: jquery jqgrid

我想知道如何在内联编辑行后触发reloadGrid。

<script type="text/javascript">

    jQuery(document).ready(function(){
      var lastcell; 
      jQuery("#grid").jqGrid({
          url:'{{ json_data_handler }}?year={{ get_param_year }}&month={{ get_param_month }}&project_id={{ get_param_project_id }}',
          datatype: "json",
          mtype: 'GET',
          colNames:['hour_record_pk', 'project_pk', 'weekday', 'date', 'sum', 'description'],
          colModel:[
                    {name:'hour_record_pk',index:'hour_record_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'project_pk',index:'project_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'weekday',index:'weekday', width:300, editable:false, sortable:false},
                    {name:'date_str',index:'date_str', width:300, editable:true, sortable:false, editoptions:{readonly:true}},
                    {name:'sum',index:'sum', width:100, editable:true, sortable:true,editrules:{number:true,minValue:0,maxValue:24,required:true}},
                    {name:'description',index:'description', width:600, editable:true, sortable:false,},
               ],
         jsonReader : {
              repeatitems:false
         },
          rowNum:31,
          rowList:[10,20,31],
          //pager: jQuery('#gridpager'),
          sortname: 'id',
          viewrecords: true,
          sortorder: "asc",
          width: 800,
          height: 750,
          caption:"Hour Record Overview",
          reloadAfterEdit: true, //seems to have no effect
          reloadAfterSubmit: true, //seems to have no effect
          onSelectRow: function(id){    
                if(id && id!==lastcell){
                    jQuery('#grid').jqGrid('restoreRow',lastcell);
                    jQuery('#grid').jqGrid('editRow',id,true);
                    lastcell=id;
                    }
                }, 
          editurl:"{% url set_hour_record_json_set %}"
     }).navGrid('#gridpager');
    });

function reload(result) {
    $("#grid").trigger("reloadGrid"); 
    } 

我已经创建了一个重载方法,但我不确定将它放在哪里。我试过了:

jQuery('#grid').jqGrid('editRow',id,true,reload());

但是当用户点击一行时已经调用了它。 上面的代码允许用户点击一行,当按下输入时,提交数据并更新或创建记录。

用户创建新对象后,我必须重新加载网格,因为我需要新创建的对象的对象ID,以便进一步编辑这一行。

编辑:解决方案:

onSelectRow: function(row_id){
             if(row_id != null) {
                if(row_id !== last_selected_row) {
                    jQuery('#grid').jqGrid('restoreRow',last_selected_row);
                    jQuery('#grid').jqGrid('saveRow',row_id)
                           .editRow(row_id, true,false,reload);
                    last_selected_row = row_id; 
                } else {
                    last_selected_row=row_id;
                }
              }
            },  

更新:供将来参考。所有以js网格开头的用户也可以查看Slickgrid,因为我从jqgrid切换到slickgrid并且只能推荐它。

5 个答案:

答案 0 :(得分:38)

这是editRow函数的语法

jQuery("#grid_id").jqGrid('editRow', rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc);
  

oneditfunc :成功后触发   之前访问该行进行编辑   允许用户访问输入   领域。行的id作为a传递   该函数的参数。

     

succesfunc :如果已定义,则此功能   在之后立即调用   请求成功。这个功能   传递从中返回的数据   服务器。取决于来自的数据   服务器;这个功能应该返回   是真还是假。

     

aftersavefunc :如果定义了,这个   函数在数据之后被调用   保存到服务器。参数传递   这个函数是rowid和   来自服务器请求的响应。

如果您希望在保存行后重新加载网格,则对editRow方法的调用应如下所示。

jQuery('#grid').jqGrid("editRow", id, true, '', '', '', '', reload)

我已经指定了重新加载功能,该功能会为“ aftersavefunc ”参数重新加载网格

重载方法本身应定义如下

function reload(rowid, result) {
  $("#grid").trigger("reloadGrid"); 
}

答案 1 :(得分:3)

试试这个

      $("#grid").jqGrid('editRow', rowid, true, null, null, null, {}, aftersavefunc);

//

        function aftersavefunc(rowid, result) {
        $("#grid").trigger("reloadGrid");
    }


//

答案 2 :(得分:0)

看一下saveRow方法:

  

saveRow(rowid,succesfunc,url,   extraparam,aftersavefunc,   onerrorfunc)

定义了两个要调用的回调(successfuncs,aftersavefunc),当请求成功完成并且分别保存数据之后。

答案 3 :(得分:0)

从文档中,我认为afterSaveCell最适合您(afterSubmitCell也可以正常工作但似乎需要特定的返回值。afterEditCell在服务器命中之前发生所以那将太快了。)

jQuery('#grid').jqGrid('editRow', id, true, reload);

jQuery(document).ready(function(){
    var lastcell; 
   jQuery("#grid").jqGrid({

      // [snip earlier config]

      onSelectRow: function(id){    
            if(id && id!==lastcell){
                jQuery('#grid').jqGrid('restoreRow',lastcell);
                jQuery('#grid').jqGrid('editRow',id,true);
                lastcell=id;
                }
            }, 
      editurl:"{% url set_hour_record_json_set %}",
      onAfterSaveCell: reload
   }).navGrid('#gridpager');
});

function reload(result) {
    $("#grid").trigger("reloadGrid"); 
} 

然而,考虑到您到目前为止所描述的信息,重新加载整个网格可能是过度的。除非有提交信息的服务器端处理(意味着保存后数据库中的数据可能不同),在简单编辑后重新加载似乎是浪费时间。

至于你何时创建一个新行,除非只有服务器端的数据,否则似乎更容易从提交中获取新的id然后在jqGrid中进行个别更改。但是,最终它很大程度上取决于重新加载整个表的时间。

答案 4 :(得分:0)

Ок,现在是至少适用于我的复制粘贴解决方案

 onSelectRow: function(id){
    $('#grid').jqGrid("editRow", id, true, '', '', '', '', reloadTable);
 },
 // more confir

 // reload table after submit. Put it somewhere in your JS file
  function reloadTable(result) {
    $('#grid').trigger("reloadGrid");
  }