如何将jqGrid ColumnChooser恢复的列放回原位置?及相关问题咨询
jqGrid列选择器相关问题解答
1. 恢复列时回到原始位置的解决方案
默认情况下,columnChooser恢复隐藏列时确实会把列追加到表格末尾,要让它回到原始位置,核心思路是提前记录每个列的原始位置,在用户确认调整后,根据原始位置重新排列列顺序。
具体实现步骤:
- 初始化表格时,给
colModel里的每个列添加原始位置标记 - 在
done回调中,根据原始位置对perm数组重新排序,再执行remapColumns
代码示例:
var $grid = $('#Table'); // 保存每个列的原始位置 var colModel = $grid.jqGrid('getGridParam', 'colModel'); colModel.forEach(function(col, index) { col.origPosition = index; }); // 调用columnChooser并修改done回调 $grid.jqGrid('columnChooser', { done: function(perm) { if (perm) { // 根据原始位置重新排序perm数组 var sortedPerm = perm .map(idx => colModel[idx]) // 把索引转为列对象 .sort((a, b) => a.origPosition - b.origPosition) // 按原始位置排序 .map(col => colModel.indexOf(col)); // 转回列索引 // 重新映射列顺序 this.jqGrid('remapColumns', sortedPerm, true); } } });
这样处理后,不管用户隐藏/恢复哪列,最终显示的列都会遵循原始的位置顺序,不会乱序追加到末尾。
2. 解释perm参数
perm是columnChooser的done回调接收的核心参数,它是一个数字数组,每个元素对应colModel中列的原始索引:
- 数组的顺序代表用户在列选择器中调整后的列显示顺序
- 如果用户隐藏了某列,该列的索引会从
perm数组中移除 - 如果用户恢复了隐藏的列,该列的索引会被默认添加到
perm数组的末尾(这就是你遇到恢复列到末尾问题的原因)
举个例子:假设原始colModel有5列(索引0-4),用户把索引2的列隐藏,然后把索引1的列移到最后,此时perm数组就是[0,3,4,1]。
3. 在columnChooser中只显示特定列
完全可以实现!columnChooser提供了columns参数,你可以直接传入想要显示的列的原始索引数组,就能限制选择器中只展示这些列。
比如你想只显示索引3、4、7的列,代码如下:
$('#Table').jqGrid('columnChooser', { columns: [3,4,7], // 指定只显示这些索引的列 done: function(perm) { if (perm) { this.jqGrid('remapColumns', perm, true); } } });
注意:这里的索引是colModel定义时的原始索引,和列当前是否显示无关。如果需要动态筛选(比如排除某些固定列),也可以先通过getGridParam('colModel')获取列模型,再过滤出目标索引数组传给columns参数。
内容的提问来源于stack exchange,提问作者user9074131
相关产品推荐
相关产品推荐

