jqgrid 在使用工具栏搜索后执行 reloadgrid 会保留过滤状态,导致后续搜索仅作用于已过滤的子集;需调用 cleartoolbar(true) 清除过滤器并重置数据源视图,再配合 refreshfiltertoolbar 实现正确刷新。
在使用 jqGrid 的高级搜索或内联工具栏(filterToolbar)时,一个常见但易被忽视的问题是:当用户输入搜索条件并触发 reloadGrid() 后,Grid 的内部数据缓存(postData 中的搜索参数)并未自动重置。即使你调用了 setGridParam({ url: ‘…’ }) 并触发重载,jqGrid 仍会将上一次的搜索条件(如 searchField、searchString、searchOper 等)一并提交到服务器——这本身是预期行为;但问题在于客户端本地过滤逻辑(尤其是启用 searching: true + toolbar: true 时)可能错误地对已加载的子集(如 26 条)进行二次过滤,而非重新请求完整数据集(100 条)。
根本原因在于:clearToolbar(false)(默认)仅清空输入框文本,但不重置 Grid 内部的搜索参数和过滤状态;而 clearToolbar(true) 才会真正清除 postData 中所有搜索字段,并通知 Grid 恢复“无过滤”状态。
✅ 正确做法如下:
-
清除过滤器(关键步骤):在调用 reloadGrid() 前,显式调用 clearToolbar(true):
function refreshGrid() { var $grid = $("#grid_id"); var gridDom = $grid[0]; // ✅ 强制清除所有搜索参数(包括 postData 和 UI 输入框) if (gridDom.clearToolbar) { gridDom.clearToolbar(true); } // 更新参数(可选:确保 URL 和 datatype 正确) $grid.jqGrid('setGridParam', { datatype: 'json', url: '/api/data' // 替换为你的实际 URL }); // ✅ 触发重载(此时将发送无搜索参数的请求,获取全量数据) $grid.trigger('reloadGrid', [{ current: true }]); } -
若需保留搜索文本但强制服务端重过滤(例如用户编辑了搜索框内容),请改用 refreshFilterToolbar():