【问题标题】:How to maintain checkbox selection while reloading the JQuery Grid?如何在重新加载 JQuery Grid 时保持复选框选择?
【发布时间】:2012-05-01 00:49:13
【问题描述】:

我有一个 JQuery 网格,每当服务器上发生某些事件(即数据集中的更新)时,我都会重新加载它,并在网格中显示最新的数据集。该网格的第一列也有复选框。发生的情况是,假设用户正在选择一些复选框,与此同时,如果网格由于服务器上的数据更新而重新加载,我的网格会重新加载最新的数据集,但我之前的所有复选框选择都会丢失。如何在重新加载网格后再次标记这些选中的复选框?

请提出建议。

function PushData() {
    // creates a proxy to the Alarm hub
    var alarm = $.connection.alarmHub;
    alarm.notification = function () {
        $("#jqTable").trigger("reloadGrid",[{current:true}]); 
    };
    // Start the connection and request current state
    $.connection.hub.start(function () {
        BindGrid();
    });
}
function BindGrid() {
    jqDataUrl = "Alarm/LoadjqData";
    var selectedRowIds;
    $("#jqTable").jqGrid({
        url: jqDataUrl,
        cache: false,
        datatype: "json",
        mtype: "POST",
        multiselect: true ,
        postData: {
            sp: function () { return getPriority(); },
            },
        colNames: ["Id", "PointRef", "Value", "State", "Ack State", "Priority", "AlarmDate", "", ""],
        colModel: [
            //{ name: 'alarmId_Checkbox', index: 'chekbox', width: 100, formatter: "checkbox", formatoptions: { disabled: false }, editable: true, edittype: "checkbox" },
            { name: "AlarmId", index: "AlarmId", width: 70, align: "left" },
            { name: "PointRef", index: "PointRef", width: 200, align: "left" },
            { name: "Value", index: "Value", width: 120, align: "left" },
            { name: "AlarmStateName", index: "AlarmStateName", width: 150, align: "left" },
            { name: "AcknowledgementStateName", index: "AcknowledgementStateName", width: 200, align: "left" },
            { name: "Priority", index: "Priority", width: 130, align: "left" },
            { name: "AlarmDate", index: "AlarmDate", width: 250, align: "left" },
            { name: "TrendLink", index: "Trends", width: 100, align: "left" },
            { name: "MimicsLink", index: "Mimics", width: 100, align: "left" }
            ],
        // Grid total width and height
        width: 710,
        height: 500,
        hidegrid: false,
        // Paging
        toppager: false,
        pager: $("#jqTablePager"),
        rowNum: 20,
        rowList: [5, 10, 20],
        viewrecords: true, // "total number of records" is displayed
        // Default sorting
        sortname: "Priority",
        sortorder: "asc",
        // Grid caption
        caption: "Telemetry Alarms",
        onCellSelect: function (rowid, icol, cellcontent, e) {
            var cm = jQuery("#jqTable").jqGrid('getGridParam', 'colModel');
            var colName = cm[icol];
            //alert(colName['index']);
            if (colName['index'] == 'AlarmId') {
                if ($("#AlarmDialog").dialog("isOpen")) {
                    $("#AlarmDialog").dialog("close");
                }
                AlarmDialogScript(rowid)
            }
            else if (colName['index'] == 'Trends') {
                TrendDialogScript(rowid)
            }
            else if (colName['index'] == 'Mimics') {
                MimicsDialogScript(rowid)
            }
            else {
                $("#jqTable").setCell(rowid, "alarmId_Checkbox", true); //Selects checkbox while clicking any other column in the grid
            }
        },
        recreateFilter: true,
        emptyrecords: 'No Alarms to display',
        loadComplete: function () {
            var rowIDs = jQuery("#jqTable").getDataIDs();
            for (var i = 0; i < rowIDs.length; i++) {
                rowData = jQuery("#jqTable").getRowData(rowIDs[i]);
                //change the style of hyperlink coloumns
                $("#jqTable").jqGrid('setCell', rowIDs[i], "AlarmId", "", { 'text-decoration': 'underline', 'cursor': 'pointer' });
                $("#jqTable").jqGrid('setCell', rowIDs[i], "TrendLink", "", { 'text-decoration': 'underline', 'cursor': 'pointer' });
                $("#jqTable").jqGrid('setCell', rowIDs[i], "MimicsLink", "", { 'text-decoration': 'underline', 'cursor': 'pointer' });
                if ($.trim(rowData.AcknowledgementStateName) == 'Active') {
                    $("#jqTable").jqGrid('setCell', rowIDs[i], "AcknowledgementStateName", "", { 'background-color': 'red', 'color': 'white' });
                }
                else if ($.trim(rowData.AcknowledgementStateName) == 'Acknowledged') {
                    $("#jqTable").jqGrid('setCell', rowIDs[i], "AcknowledgementStateName", "", { 'background-color': 'Navy', 'color': 'white' });
                }
            }
            //$("#jqTable").jqGrid('hideCol', "AlarmId") //code for hiding a particular column
        },
        gridComplete: function () {
            $('#jqTable input').bind('mouseover', function () {
                var tr = $(this).closest('tr');
                if ($("#AlarmDialog").dialog("isOpen")) {
                    $("#AlarmDialog").dialog("close");
                }
                AlarmDialogScript(tr[0].id);
            }
            );
        }
    }).navGrid("#jqTablePager",
    { refresh: true, add: false, edit: false, del: false },
    {}, // settings for edit
    {}, // settings for add
    {}, // settings for delete
    {sopt: ["cn"]} // Search options. Some options can be set on column level
    )
    .trigger('reloadGrid', [{page:1, current:true}]);
}

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    如果我理解你是正确的,你只需要使用额外的参数 i

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

    $("#list").trigger("reloadGrid", [{page: 1, current: true}]);
    

    (请参阅the answer)。它的作用与 Justin 的建议几乎相同。

    根据您在重新加载网格时的确切含义,您可能需要保存网格状态,包括localStorage 中的选定项目列表,并在加载网格后重新加载状态。 This answer 详细描述了实现。答案中对应的demo 可以使用 4.3.2 版中引入的新 jqGrid 事件进行简化。

    【讨论】:

    • 谢谢奥列格。每当服务器上的数据发生更改时,我的网格就会自动重新加载最新的数据集,并且我想在重新加载期间维护选定的复选框。在对网格进行分页时,我仍然需要整理维护选择。再次感谢您指出有价值的答案..
    • @user535189:不客气!您在“网格自动重新加载”下的意思是什么?你在某个地方打电话.trigger("reloadGrid") 吗?在这种情况下,您可以只使用我描述的附加参数来保存选择。如果您重新加载页面而不是重新加载网格数据,您可以使用localStorage
    • 再次感谢奥列格。当服务器上的数据发生变化时,我的 Web 服务器会向浏览器发送通知(使用 SignalR),并且为了响应通知,我只需调用一个方法(BindGrid)来使用最新数据创建网格。 BindGrid() 方法的代码为 .trigger("reloadGrid")。我尝试了附加参数,但没有帮助。我在 colModel 中声明了复选框如下: { name: 'checkbox', index: 'chekbox', width: 100, formatter: "checkbox", formatoptions: { disabled: false }, editable: true, edittype: "checkbox " },.我做错了吗?
    • @user535189:为什么不使用multiselect: true 选项?它将自动创建带有复选框的“cb”列。此外,我不明白您为什么要重新创建网格BindGrid() 而不是仅使用.trigger("reloadGrid")?你有哪个datatype('json','local')?你有一个简单的网格或者可能是 TreeGrid?
    • 您好,Oleg,如何将我的 BindGrid () 方法的代码发送给您。当我第一次使用 JQuery 网格时,我可能做错了什么,但我对这个强大插件的功能感到非常惊讶。请看这个: function PushData() { // 创建警报中心的代理 var alarm = $.connection.alarmHub; alarm.notification = function () { BindGrid(); }; // 启动连接并请求当前状态 //$.connection.hub.start(); $.connection.hub.start(function () { //alarm.getAlarms(); BindGrid(); }); }
    【解决方案2】:

    您可以在重新加载网格之前保存选择,例如在beforeRequest 事件中:

    selectedRowIDs = jQuery('#myGrid').getGridParam('selarrrow');
    

    然后在重新加载网格后,您可以循环 selectedRowIDs 并使用 setSelection 重新选择每个网格。例如:

    for (i = 0, count = selectedRowIDs.length; i < count; i++) {
        jQuery('#myGrid').jqGrid('setSelection', selectedRowIDs[i], false);
    }
    

    您可以在 loadComplete 事件中运行此代码。

    【讨论】:

    • 贾斯汀,非常感谢,它就像一个魅力。我必须做的唯一更改是在阅读 beforeRequest 中的复选框时,我做了以下操作: var selectedRowIds = []; $('#jqTable input:checked').each(function () { var tr = $(this).closest('tr'); selectedRowIds .push(tr[0].id); });并设置复选框 (i = 0; i
    • How can I maintain these selection while paging - 如果您在客户端维护此数据,则需要将它们存储在数据结构中,例如数组。然后,当页面发生变化时(可能在 loadComplete 中),您需要扫描网格并选择数据结构中的任何行。
    • @user535189:我想你不知道你有权vote up 每天(见here)大约 30 个答案和问题,你会发现 有帮助。投票的主要目的是帮助搜索引擎。可以将“接受”答案和投票结合起来。所以如果你想帮助stackoverflow的其他访问者你应该使用你的投票权。
    • 谢谢奥列格,我以前不知道这个
    【解决方案3】:

    使用

    recreateFilter: true 
    

    你应该完成了

    【讨论】:

    • 但是,此选项仅适用于模态对话框。我相信操作员正在询问网格本身中的选择复选框。
    猜你喜欢
    • 2015-03-28
    • 2016-08-23
    • 2015-10-18
    • 1970-01-01
    • 2010-09-22
    • 2020-03-11
    • 2011-03-19
    相关资源
    最近更新 更多