jqGrid的:删除最后一个记录这么想的刷新网格+麻烦分页(jqGrid : deleting la

2019-09-17 19:33发布

我已经在jqGrid的两个问题

1)假设有91条记录表ROWNUM设置为10,现在,当我浏览到最后一页,并删除备案号91,它不会自动重新加载电网,当我使用ReloadGrid明确它去重新从整个数据控制器这增加了网络负载。

2)在我的网格有10页,当我输入页码比在文本框中最大页面越大它给人的空白格,理想的应该dispaly一些消息。

任何解决方案?

添加的代码FOR问题,更好地理解

$(document).ready(function () {
        $('#jqgCars').jqGrid({
            //url from wich data should be requested
            url: '@Url.Action("CarsListing", "Car")?Carid=' + getID(),
            //event for inline edit
            onSelectRow: function (currentSelectedRow) {
                if (currentSelectedRow && currentSelectedRow != $.lastSelectedRow) {
                    //save changes in row 
                    $('#jqgCars').jqGrid('saveRow', $.lastSelectedRow, false);
                    $.lastSelectedRow = currentSelectedRow;
                }
            },
            //type of data
            datatype: 'json',
            //url access method type
            mtype: 'POST',
            //columns names
            colNames: ['ID','Number','Name'],
            //columns model
            colModel: [
                            { name: 'ID', index: 'ID', align: 'left', editable: false },
                            { name: 'Number', index: 'Number', align: 'left', editable: true, formatter: "text", edittype: 'text', editrules: { required: true}, editoptions:{maxlength:"25"}},
                            { name: 'Name', index: 'Name', align: 'left', editable: true, formatter: "text", edittype: 'text', editrules: { required: false} , editoptions:{size:"35",maxlength:"255"}},
                          ],
            //pager for grid
            pager: $('#jqgpCars'),
            //number of rows per page
            rowNum: 2,
            //initial sorting column
            sortname: 'name',
            //initial sorting direction
            sortorder: 'asc',
            //display total records count
            viewrecords: true,
            //grid height
            height: '100%' 
        });
        $('#jqgCars').jqGrid('navGrid', '#jqgpCars', { add: true, del: true, edit: true, search: false });
        $('#jqgCars').jqGrid('hideCol', "ID");
        $('#jqgCars').setGridWidth(600 , true);
        var dialogPosition = $(this).offset();
    });

UPDATE -解决方案

问题的解决方案#1

$.extend($.jgrid.del, {
            afterComplete: function () {
                var p = $('#jqgCars')[0].p;
                var newPage = p.page; // Gets the current page
                if (p.reccount === 0 && newPage > p.lastpage && newPage > 1) {
                    // if after deleting there are no rows on the current page and lastpage != firstpage than
                    newPage--; // go to the previous page
                }
                // reload grid to make the row from the next page visable.
                $(p.pager + " input.ui-pg-input").val(newPage); //Here setting the new page into textbox before loading in case of longer grid it would look nice
                $('#jqgCars').trigger("reloadGrid", [{page: newPage}]); // reloading grid to previous page
            } 
        });

问题#2解决方法是精确的张贴由奥列格

这正常工作与jqGrid的V4.1.2

Answer 1:

这是很好的问题! 在旧的答案这个和这个 ,你会发现你的第一个问题的答案。 因为答案很长,你需要在服务器上使用删除数据我在这里重复了同样的想法。

这不是好问一个问题里面两个独立的问题。 这些问题不利于搜索引擎。 从你的问题的第2部分有问题的用户将需要阅读不需要的信息。 所以,请不要在将来做到这一点。

我开始与你的第二个问题的答案。 如果寻呼机的任何值,然后按输入部分用户类型输入页面的行会从服务器或从本地数据集请求。 如果用户选用大页码电网将成功地重新加载,但没有数据。 绝对相同的结果,一个将在从最后一页删除最后一行的情况。 与相同数量的页面将重新加载,用户将看到空网格。

要解决一个可以使用下面的问题onPaging回调:

onPaging: function (pgButton) {
    var p = this.p;
    if (pgButton === "user" && p.page > p.lastpage) {
        alert ("You can't choose the page " + $(p.pager + " input.ui-pg-input").val());
        p.page = p.currentPage; // restore the value of page parameter
        return 'stop';
    }
},
loadComplete: function () {
    // because on enter in the pager input the value of this.p.page
    // will be changed BEFORE calling of the onPaging the original
    // (current) page number will be overwritten. To save the problem
    // we can save somewhere the copy of the this.p.page. To be able
    // easy to maintain multiple grids on the page we can save the
    // copy as new jqGrid option:
    this.p.currentPage = this.p.page;
}

我们不走回到你的问题的第一部分。 为了解决这个问题,可以使用afterComplete的回调delGridRow方法做额外的操作后,最后一行将被删除。 该代码可以是以下几点:

afterComplete: function () {
    var p = this.p, newPage = p.page;
    if (p.lastpage > 1) {// on the multipage grid reload the grid
        if (p.reccount === 0 && newPage === p.lastpage) {
            // if after deliting there are no rows on the current page
            // which is the last page of the grid
            newPage--; // go to the previous page
        }
        // reload grid to make the row from the next page visable.
        $(this).trigger("reloadGrid", [{page: newPage}]);
    }
}

所以我们只是减少页码空网的情况下,并重新加载电网一次。

本地电网(删除数据的情况下, datatype: "local" ),可以使用下面的设置:

$.extend($.jgrid.del, {
    // because I use "local" data I don't want to send the changes to the server
    // so I use "processing:true" setting and delete the row manually in onclickSubmit
    onclickSubmit: function(options, rowid) {
        var gridId = $.jgrid.jqID(this.id),
            p = this.p,
            newPage = p.page,
            $this = $(this);

        options.processing = true;

        // delete the row
        $this.jqGrid("delRowData", rowid);
        $.jgrid.hideModal("#delmod" + gridId,
            { gb: options.gbox, jqm: options.jqModal, onClose: options.onClose});

        if (p.lastpage > 1) {// on the multipage grid reload the grid
            if (p.reccount === 0 && newPage === p.lastpage) {
                // if after deliting there are no rows on the current page
                // which is the last page of the grid
                newPage--; // go to the previous page
            }
            // reload grid to make the row from the next page visable.
            $this.trigger("reloadGrid", [{page: newPage}]);
        }
        return true;
    },
    processing: true
});

相应的演示中,你可以看到现场在这里 。



Answer 2:

关于#1,你说:

使用ReloadGrid明确它去从控制器,增加了网络负载重新加载整个数据。

但我认为这是你必须做什么,因为jqGrid的是一次只检索数据的页面。 如果不从服务器重新加载,怎么会网格不断重新填充本身? 也许我失去了一些东西?


关于#2,后一个AJAX调用网格使用页码从XML / JSON响应。 你可以在看到这个源代码grid.base.js :

ts.p.page = $.jgrid.getXmlData( xml,xmlRd.page ) || 0;

...

ts.p.page = $.jgrid.getAccessor(data,dReader.page) || 0;

这两个功能还包括调用更新寻呼机页码:

if (!more) { ts.updatepager(false,true); } // Note: More is true if pageNum > 0

所以,一个解决方案是为您的服务器代码来检测,如果给定的页面数量比最大更大,并且将其设置回在你的反应最大。 如果你这样做,你查询的实际数据之前,你还可以调整该查询的最后一页返回数据,防止你不必显示错误消息。



Answer 3:

我有同样的问题。 这是我对这个问题的解决方案:

$("#jqgCars").clearGridData(true).trigger(
   "reloadGrid", [{ current: true }]
);


文章来源: jqGrid : deleting last record dosen't refresh the grid + trouble with paging