【问题标题】:How to perform action in jqGrid after adding new row添加新行后如何在jqGrid中执行操作
【发布时间】:2012-01-10 11:41:09
【问题描述】:

jqGrid 中是否有事件在添加新行后执行操作?

我在jqGrid wiki 中看到有事件 afterInsertRow,但显然每当 jqGrid 在显示表格时将行“插入”到表格时都会触发它。

那么当我想在用户“插入”(保存)新行之后做某事时应该使用什么?或者,是否有任何变量可以让我“知道”添加了新行?

【问题讨论】:

  • 您应该更准确地描述您使用哪种“插入”。例如,您使用表单编辑。用户点击“添加”按钮,用户点击“提交”按钮后数据将成功保存在服务器上。您希望在接收到数据成功添加的服务器的响应后执行一些操作(修改服务器响应)。您是否从服务器发回新行的id
  • 是的,用户点击“添加”按钮,为新行填写数据,点击“提交”按钮,表格中的新行就创建好了。我不需要修改服务器响应。在这种特殊情况下,我只需要使用 setSelection 方法选择表中的第一行,但如果添加了新行,我需要防止这种行为。这就是我为此寻找事件的原因。
  • 我有从服务器发送的行 ID。
  • 您仍然没有提供足够的信息。您是使用本地网格还是将数据保存在服务器上?您是否从服务器中恢复新的行 ID?如果您从服务器返回新行的 id,您可以使用 reloadAfterSubmit: false 属性。如果您有默认的reloadAfterSubmit: true,则网格将只是从服务器重新加载。为了能够选择新行,您应该知道所选行的 id,但id 通常由服务器生成
  • 您是在服务器上使用分页数据还是将所有数据放在一个页面上?

标签: jquery jqgrid


【解决方案1】:

主要问题是要能够选择行,您需要知道新行的 id。在大多数情况下,id 将由您在服务器上保存数据的数据库生成。因此,对服务器代码的第一个要求是在“添加”操作的服务器响应中返回新行的 id。

例如,您的服务器代码返回您所在行的 ID 作为“添加”操作的响应。

$("#list").jqGrid('navGrid', '#pager', {/*navGrid options*/}, {/*Edit optoins*/}, {
    /*Add options:*/
    reloadAfterSubmit: false,
    afterSubmit: function (response) {
        return [true, '', response.responseText];
    },
    addedrow: "last", // add new row at the end of grid
    afterComplete: function (response, postdata) {
        // this.gbox is the string like "#gbox_list"
        var gridId = this.gbox.substr(6);
        //if (postdata.oper === "add") {
        //    // highlight the new "added" row
        //    var row = $("#" + $.jgrid.jqID(postdata.id));
        //    row.effect("highlight", {}, 3000);
        //}
        $('#' + gridId).jqGrid('setSelection', postdata.id);
    }
});

afterComplete 的评论部分,我展示了如何使用jQuery UI highlight 效果突出显示新添加的行(请参阅the old answer)。它可以替代行的选择。您还可以同时使用选择和突出显示效果。

reloadAfterSubmit: false 选项至少有两个缺点。

  1. 如果在网格中使用已排序的数据(jqGrid 的sortname 参数不为空),则在将新行添加为第一行或作为网格中的最后一行。
  2. 如果网格已经有每页的最大行数(由rowNum 参数定义),则添加新行将跟随每页行数过多的网格。

所以你可以执行以下操作

var idToSelect;

$("#list").jqGrid({
    // ... all jqGrid options
    loadComplete: function () {
        if (idToSelect) {
            $(this).jqGrid('setSelection', idToSelect);
            //$("#" + $.jgrid.jqID(idToSelect)).effect("highlight", {}, 3000);
            idToSelect = undefined;
        }
    }
}).jqGrid('navGrid', '#pager', {/*navGrid options*/}, {/*Edit optoins*/}, {
    /*Add options:*/
    afterSubmit: function (response) {
        // save the id of new row. If the format of the data returned from
        // the server is different you should change the next row
        // corresponds to the returned data. For example if the server returns
        // back JSON data in the form {"myId":"123"} you should use
        // $.parseJSON(response.responseText).myId
        // instead of response.responseText below
        idToSelect = response.responseText;
        return [true, '', response.responseText];
    }
});

如果新添加的行将在重新加载网格后被选中。

【讨论】:

  • 感谢您的全面回答。最后我用第二种解决方案做到了。
  • @cincplug:不客气!我认为这个问题对其他人来说会很有趣,所以我为你的问题 +1。
  • 终于因为你的好回答我的谷歌搜索停止了。非常感谢你。喜欢它。
  • @Ashish4434:不客气!我想知道我的旧答案仍然有用。
猜你喜欢
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多