【问题标题】:jqGrid and preselection of rows with multiselect optionjqGrid 和使用多选选项预选行
【发布时间】:2026-02-04 00:15:01
【问题描述】:

我有一个带有多选功能的 jqGrid。
例如,如果另一列为真,我希望能够预先检查一定数量的行。
到目前为止我所做的是从服务器传递一个包含布尔值的元素(列)。 我在 gridComplete 事件中隐藏了这一列。
我可以在加载网格期间选择 - 并检查预定义的行吗?

更新:

这是我的代码:

jQuery("#OrdersGrid").jqGrid({
    url: $.SalesOrders.url.OrdersFetchUrl,
    postData: { OrderStatus: orderStatus },
    datatype: 'json',
    mtype: 'POST',
    colNames: ['N.Ordine', 'Cliente', 'Ragione Sociale', 'Stato', 'Fido', 'Data', ''],
    colModel: [
               { name: 'Number', index: 'Number', editable: false, resizable: true, sortable: false, width: 76, align: 'left' },
               { name: 'CustomerCode', index: 'CustomerCode', editable: false, resizable: true, sortable: false, width: 50, align: 'left' },
               { name: 'CustomerName', index: 'CustomerName', editable: false, resizable: true, sortable: false, width: 410, align: 'left' },
               { name: 'Status', index: 'Status', editable: false, resizable: true, sortable: false, width: 40, align: 'center' },
               { name: 'LoCStatus', index: 'LoCStatus', editable: false, resizable: true, sortable: false, width: 40, align: 'center' },
               { name: 'Date', index: 'Date', editable: false, resizable: true, sortable: false, width: 70, align: 'right' },
               { name: 'Checked', index: 'Checked', editable: false, resizable: false, visible: false }
              ],
    pager: $('#OrdersPager'),
    rowNum: 30,
    width: 794,
    height: 220,
    viewrecords: true,
    shrinkToFit: false,
    scroll: true,
    rownumbers: true,
    hidegrid: false,
    multiselect: true,
    emptyrecords: "Nessun record presente",
    loadComplete: function (data) {
        if (data.rows.length > 0) {
            for (var i = 0; i < data.rows.length; i++) {
                if (data.rows[i].cell[6] == 'true') {
                    jQuery("#OrdersGrid").jqGrid('setSelection', data.rows[i].id, true);
                }
            }
        }
        jQuery("#OrdersGrid").jqGrid('hideCol', 'Checked');
    }
});

我已经实现了 Oleg 的解决方案,它就像一个魅力。

【问题讨论】:

    标签: jquery jqgrid multi-select


    【解决方案1】:

    您没有发布您使用的网格的定义,所以我的一些问题保持开放。尽管如此,我希望您能找到问题here 的答案。在答案中包含的the demo 中使用了参数loadonce:true,这使得一切变得更加复杂。将被选中的行不在加载数据的第一页上。此外,在演示中没有可用于确定应选择哪些行的列(甚至隐藏)。取而代之的是,有关网格中选择的信息将作为 JSON 响应的userdata 部分的一部分从服务器发送。这种方式更通用,我希望它也适用于您的网格。

    更新:我觉得你的代码很好。我只看到了需要优化的小地方:

    1. editable: falseresizable: truealign: 'left' 属性在colModel 中是默认的(请参阅jqGrid documentation)。所以我建议你删除这些值。
    2. visible: false 属性在 colModel 中不存在。你的意思可能是hidden: true。使用正确的属性后,jQuery("#OrdersGrid").jqGrid('hideCol', 'Checked'); 将不再需要 loadComplete 中的语句。
    3. 在循环中每次使用jQuery("#OrdersGrid"),您可以将值保存在一个变量中:在jqGrid初始化之前var mygrid = jQuery("#OrdersGrid");,然后您的代码将是mygrid.jqGrid({...,loadComplete: function (data) {...mygrid.jqGrid('setSelection', ...

    一些补充说明。语句data.rows[i].cell[6] = 'true' 表明您使用Checked.ToString() 序列化Checked 属性。您可以改用Checked?"1":"0" 并减少传输数据的大小。我使用许多带有formatter:"checkbox" 的网格,它们解释“1”和“true”,就像选中的一样。在您的情况下,您完全可以使用数据格式,因此您可以使用“1”和“0”,甚至可以使用“1”和“”。

    如果您仅使用 Checked 列来传输有关行选择的信息,您可以完全从网格中删除 Checked 列。在loadCompletedata 参数中,您仍会看到Checked 属性(data.rows[i].cell[6]),但会减少列数。

    【讨论】:

    • 我附上了一些代码。正如您所看到的,我的 MVC 控制器流式传输一个已检查的列,这是我的鉴别器。我在您发送给我的一个链接中使用了该示例,它工作正常。您如何看待这个解决方案?
    • @LeftyX:我更新了我的答案,对您的代码提出了一些小建议。
    • 非常有帮助。我倾向于不优化 javascript,但我知道我应该优化,就像我对服务器端所做的那样。