我完全同意 Justin 的观点,即 jqGrid 不支持动态切换 multiselect 参数。所以以任何方式对他的回答+1。我同意,切换multiselect 参数的最简单且唯一受支持的方法将与重新初始化(重新创建)网格相关联。
因此,如果您需要更改 jqGrid 的 multiselect 参数的值,您需要首先更改 multiselect 参数相对于 setGridParam,然后重新创建相对于 GridUnload 方法的网格,例如。从the answer 看到the demo。
不过,我觉得你的问题很有趣(你也可以 +1)。至少尝试实现该行为是一项小运动任务。
一些用于理解问题复杂性的评论。在填充网格主体期间,jqGrid 代码根据multiselect 参数的值计算单元格的位置(参见gi 值here 的设置以及稍后使用它,例如here)。因此,如果您隐藏包含复选框的“cb”列,则单元格位置将被计算错误。 只有当“cb”列根本不存在或您有multiselect: true时,才会正确填充网格。因此,如果网格中存在“cb”列,则必须设置multiselect: truebefore 分页或网格排序。即使对于隐藏列“cb”,您也必须将multiselect 设置为true。另一方面,您必须将multiselect 设置为与您需要直接填充网格后的实际行为相对应的值(例如在loadComplete 中)。
尽管我的英语很差,但我希望我能清楚地表达我的意思。为了确保所有人都正确理解我,我再重复一遍。如果您想尝试动态切换multiselect,您必须执行以下步骤:
- 使用
multiselect: true 以任何方式创建网格以获得“cb”列
- 如果您想要单选行为,请设置
multiselect: false 并隐藏 loadComplete 中的“cb”列
- 设置
multiselect: true总是之前刷新网格:在分页、排序、过滤、重新加载等之前。
我创建了the demo,这似乎可行。它有一个可以用来切换multiselect参数的按钮:
在演示中,我使用了 reloadGrid 事件的子类化(覆盖原始事件句柄)的技巧,我描述了 the old answer。
您将在下面找到演示代码中最重要的部分:
var events, originalReloadGrid, $grid = $("#list"), multiselect = false,
enableMultiselect = function (isEnable) {
$(this).jqGrid('setGridParam', {multiselect: (isEnable ? true : false)});
};
$grid.jqGrid({
// ... some parameters
multiselect: true,
onPaging: function () {
enableMultiselect.call(this, true);
},
onSortCol: function () {
enableMultiselect.call(this, true);
},
loadComplete: function () {
if (!multiselect) {
$(this).jqGrid('hideCol', 'cb');
} else {
$(this).jqGrid('showCol', 'cb');
}
enableMultiselect.call(this, multiselect);
}
});
$grid.jqGrid('navGrid', '#pager', {add: false, edit: false, del: false}, {}, {}, {},
{multipleSearch: true, multipleGroup: true, closeOnEscape: true, showQuery: true, closeAfterSearch: true});
events = $grid.data("events"); // read all events bound to
// Verify that one reloadGrid event hanler is set. It should be set
if (events && events.reloadGrid && events.reloadGrid.length === 1) {
originalReloadGrid = events.reloadGrid[0].handler; // save old
$grid.unbind('reloadGrid');
$grid.bind('reloadGrid', function (e, opts) {
enableMultiselect.call(this, true);
originalReloadGrid.call(this, e, opts);
});
}
$("#multi").button().click(function () {
var $this = $(this);
multiselect = $this.is(":checked");
$this.button("option", "label", multiselect ?
"To use single select click here" :
"To use multiselect click here");
enableMultiselect.call($grid[0], true);
$grid.trigger("reloadGrid");
});
更新:如果在 1.8 或更高版本中使用 jQuery,则必须将行 events = $grid.data("events"); 更改为 events = $._data($grid[0], "events");。可以找到修改后的demohere。