Jquery jqGrid:删除最后一条记录dosen';t刷新网格+;寻呼问题

Jquery jqGrid:删除最后一条记录dosen';t刷新网格+;寻呼问题,jquery,jqgrid,jqgrid-asp.net,Jquery,Jqgrid,Jqgrid Asp.net,我在jqGrid中有两个问题 1) 假设表中有91条记录,rownum设置为10,现在当我导航到最后一页并删除记录编号91时,它不会自动重新加载网格,当我显式使用ReloadGrid时,它会从控制器重新加载整个数据,这会增加网络负载。 < P> 2)在我的网格中有10页,当我在文本框中输入大于MAX页面的页码时,它给出了空白网格,理想情况下它应该显示一些信息。 有解决办法吗 添加代码以更好地理解问题 $(document).ready(function () { $('#jq

我在jqGrid中有两个问题

1) 假设表中有91条记录,rownum设置为10,现在当我导航到最后一页并删除记录编号91时,它不会自动重新加载网格,当我显式使用ReloadGrid时,它会从控制器重新加载整个数据,这会增加网络负载。

< P> 2)在我的网格中有10页,当我在文本框中输入大于MAX页面的页码时,它给出了空白网格,理想情况下它应该显示一些信息。

有解决办法吗

添加代码以更好地理解问题

$(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();
    });
更新--解决方案

问题的解决方案#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与Oleg发布的完全一样

这在jqGrid v4.1.2中运行良好

关于#1,您声明:

显式地使用ReloadGrid从控制器重新加载整个数据,这增加了网络负载

但我认为这是您必须做的,因为jqGrid一次只检索一页数据。如果不从服务器重新加载,网格将如何重新填充自身?或者我错过了什么


关于#2,在AJAX调用之后,网格使用XML/JSON响应中的页码。您可以在以下列表中看到这一点:

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

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

因此,一种解决方案是让服务器代码检测给定的页码是否大于最大值,并在响应中将其设置回最大值。如果在查询实际数据之前执行此操作,还可以调整该查询以返回最后一页的数据,从而避免显示错误消息。

这是一个好问题!在旧答案中,您将找到第一个问题的答案。因为答案很长,您需要使用服务器上的数据删除,所以我在这里重复相同的想法

在一个问题中问两个独立的问题是不好的。这样的问题不适合搜索引擎。问题第2部分中出现问题的用户将不得不阅读不必要的信息。所以请以后不要这样做

我从你的第二个问题开始回答。如果用户在寻呼机的输入部分键入任何值并按Enter键,则将从服务器或本地数据集请求页面的行。如果用户选择大页码,网格将成功重新加载,但没有数据。如果从最后一页删除最后一行,结果将完全相同。具有相同编号的页面将被重新加载,用户将看到空网格

要解决此问题,可以使用以下回调:

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: 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
});

您可以在现场看到相应的演示。

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

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

你能把你用的密码贴出来吗?顺便说一下,要给我发送消息,你应该在我粘贴内容的页面上用@Oleg写评论。所以我没有收到您上次评论的任何通知。@Oleg我已经更新了关于#1:-的问题,所以我必须编写自定义代码以在控制器端重新加载(lastpage-1)页?关于#2:-我想到了在控制器端检查页码的类似解决方案,而不是任何其他解决方案?因为我必须在很多地方更改代码嗯。。。我想了解你是如何解决这个问题的。您是否使用控制器检测到最后一行被删除,然后刷新整个页面?如果是这样的话,我同意(或希望)一定有更好的方法……关于#2,这就是网格设计的工作方式。例如,在jqGrid演示下,请参见
操作
|
网格数据
,并尝试将页码设置为3。这就是说,演示使用请求中的限制/计数数字来确定
总页数
,这可能是比重新组织查询更方便的解决方案。从用户的角度来看,这也更好,因为网格自动处理问题,而不是强迫他们读取错误消息并再次更新页码。目前我没有检查这一点,认为一定有解决方案,即使在删除最后一条记录后,我也必须返回maxpage-1页面,它还将更新maxpage,因此网络负载将显著增加……对吗?@ITppl-我不知道为什么网络负载会增加,因为当jqGrid请求一页数据时,它总是向服务器发出请求。理想情况下,您可以通过请求page
maxpage-1
来解决#1。否则你会怎么做呢?问题2用你建议的代码解决了,但在问题1中,它没有获取this.p,我已经尝试了,但没有提醒它part@ITppl:您能更清楚地描述一下您目前遇到的问题吗。如果
this.p
afterComplete
中未定义,则使用一些旧版本的jqGrid,其中
this
尚未设置为网格的DOM。您可以使用
$('#jqgCars')[0]。例如,p
效果很好,谢谢您的时间和努力,我必须在解决方案#1的if条件if(p.reccount==0&&newPage==p.lastpage)到if(p.reccount==0&&newPage>p.lastpage)中做一些小的更改,因为每次服务器删除记录,它也会更新最后一页。@ITppl:不客气!我只是在完成后编写了
的代码,没有进行测试。所以一些茶
$("#jqgCars").clearGridData(true).trigger(
   "reloadGrid", [{ current: true }]
);