如何解决jqGrid多选模式下特定行的全选排除问题?
解决jqGrid全选时选中无复选框行的问题
你的beforeSelectRow仅能拦截单行点击选择的操作,但全选按钮的默认逻辑会直接遍历所有行执行选中,不会触发该事件,因此需要重写全选按钮的点击逻辑,同时优化行的判断方式,具体方案如下:
步骤1:给不可选中的行添加专属标记
在loadComplete中给天蓝色区域的行添加unselectable-row类,同时移除复选框,用class判断比硬编码列索引更可靠:
jQuery("#grid").jqGrid({ datatype: "local", width:'auto', height: 'auto', multiselect:true, colNames:[ 'no' ], colModel:[ {name:'no', align:'right', width:70} ], beforeSelectRow: function(rowid, e) { // 通过class判断是否允许选中 return !$("#" + rowid).hasClass("unselectable-row"); }, loadComplete: function(data) { $("#grid").parents('div.ui-jqgrid-bdiv').css("max-height","250px"); // 遍历行,标记不可选中的行并移除复选框 $("#grid>tbody tr").each(function() { var $row = $(this); // 替换成你的行判断逻辑 if ($row.children().eq(3).text() !== "unused") { $row.addClass("unselectable-row"); $row.find('input[type="checkbox"]').remove(); } }); }, });
步骤2:重写全选按钮的点击事件
全选按钮的ID为grid_cb(grid是你的表格ID),拦截它的默认点击行为,只选中允许选中的行:
$(function() { $("#grid_cb").on("click", function(e) { e.preventDefault(); var isCheckAll = $(this).is(":checked"); // 只操作未标记为不可选中的行 $("#grid>tbody tr:not(.unselectable-row)").each(function() { var rowId = $(this).attr("id"); if (isCheckAll) { $("#grid").jqGrid("setSelection", rowId, true); } else { $("#grid").jqGrid("resetSelection", rowId); } }); // 同步全选按钮的选中状态 $(this).prop("checked", isCheckAll); }); });
补充说明
- 避免使用
eq(3)这种硬编码列索引的方式,后续列结构变化会导致判断失效,建议改用列名取值,比如$row.find("[aria-describedby='grid_no']").text()(grid_no为表格ID+列名)。 - 重写全选逻辑时,需同步全选按钮的状态,避免出现按钮状态与实际选中状态不一致的情况。
内容的提问来源于stack exchange,提问作者JeonYongWook
相关产品推荐
相关产品推荐

