我觉得你的问题很有趣,所以我准备了演示相应解决方案的演示。
可以在下拉框中选择行,然后单击“按 ID 选择行”按钮。如果指定的行在setSelection
当前页面上,将使用方法选择它。如果该行在另一页上,则将计算新的页码,并重新加载网格并预先选择指定的行。我使用这里描述current: true
的选项。reloadGrid
重要的是,您使用loadonce: true
允许将更多内容保存为一页行。在这种情况下,网格的工作方式类似于具有参数定义的网格,该datatype: "local"
参数data
由第一次加载时从服务器返回的数据定义。
对于选择的实施,我使用答案中描述的方法。我覆盖(子类化)了jqGrid 使用select
的内部$.jgrid.from
方法的方法,以便将最后一次完整排序和过滤的本地数据保存在新的内部变量 lastSelected 中。它允许访问完整的数据集而不是仅访问当前页面(仅在执行from the line之后才包含来自line的数据而不是当前页面)。slice
演示代码中最重要的部分如下:
var mydata = [ ... ],
$grid = $("#list"),
oldFrom = $.jgrid.from,
lastSelected, i, n, $ids, id;
// "subclass" $.jgrid.from method and save the last
// select results in lastSelected variable
$.jgrid.from = function (source, initalQuery) {
var result = oldFrom.call(this, source, initalQuery),
old_select = result.select;
result.select = function (f) {
lastSelected = old_select.call(this, f);
return lastSelected;
};
return result;
};
// create the grid
$grid.jqGrid({
datatype: "local",
data: mydata,
...
loadComplete: function () {
this.p.lastSelected = lastSelected; // set this.p.lastSelected
}
});
...
// fill select with all ids from the data
$ids = $("#selectedId");
for (i = 0, n = mydata.length; i < n; i++) {
id = mydata[i].id;
$("<option>").val(id).text(id).appendTo($ids);
}
$("#selectId").button().click(function () {
var filteredData = $grid.jqGrid("getGridParam", "lastSelected"), j, l,
idName = $grid.jqGrid("getGridParam", "localReader").id,
idToSelect = $("#selectedId").val(),
rows = $grid.jqGrid("getGridParam", "rowNum"),
currentPage = $grid.jqGrid("getGridParam", "page"),
newPage;
if (filteredData) {
for (j = 0, l = filteredData.length; j < l; j++) {
if (String(filteredData[j][idName]) === idToSelect) {
// j is the 0-based index of the item
newPage = Math.floor(j / rows) + 1;
if (newPage === currentPage) {
$grid.jqGrid("setSelection", idToSelect);
} else {
// set selrow or selarrrow
if ($grid.jqGrid("getGridParam", "multiselect")) {
$grid.jqGrid("setGridParam", {
page: newPage,
selrow: idToSelect,
selarrrow: [idToSelect]
});
} else {
$grid.jqGrid("setGridParam", {
page: newPage,
selrow: idToSelect
});
}
$grid.trigger("reloadGrid", [{current: true}]);
break;
}
}
}
if (j >= l) {
$grid.jqGrid("resetSelection");
alert("The id=" + idToSelect + " can't be seen beacuse of the current filter.");
}
}
});