用于保存jqgrid状态。它使用列号保存jqgrid列状态。如果在服务器中更改了jqgrid colmodel,这将导致浏览器中的javascript错误。
免费的jqgrid是从今天的git master下载的。调整列大小或移动行后处于状态保存
saveColumnState.call($grid, $grid[0].p.remapColumns);
改为
saveColumnState.call($grid, $grid[0].p.remapColumnsByName);
并在状态下以loadComplete代码还原
if (isColState && myColumnsState.permutation.length > 0 &&
myColumnsState.permutation.length === cm.length) {
$grid.jqGrid("remapColumns", myColumnsState.permutation, true);
}
与
if (isColState && myColumnsState.permutation.length > 0 &&
myColumnsState.permutation.length === cm.length) {
$grid.jqGrid("remapColumnsByName", myColumnsState.permutation, true);
}
现在行
if (isColState && myColumnsState.permutation.length > 0 &&
导致错误
Uncaught TypeError: Cannot read property 'length' of undefined
如何解决此问题,以便在更改列定义时可以使用列状态?
方法定义为
var saveColumnState = function (perm) {
var colModel = this.jqGrid('getGridParam', 'colModel'),
i, l = colModel.length, colItem, cmName,
postData = this.jqGrid('getGridParam', 'postData'),
columnsState = {
search: this.jqGrid('getGridParam', 'search'),
page: this.jqGrid('getGridParam', 'page'),
rowNum: this.jqGrid('getGridParam', 'rowNum'),
sortname: this.jqGrid('getGridParam', 'sortname'),
sortorder: this.jqGrid('getGridParam', 'sortorder'),
autoedit: autoedit,
rownumbers: $grid.jqGrid('getGridParam', 'rownumbers') && !$grid[0].p.colModel[0].hidden,
searchWindow: searchParams,
editWindow: editParams,
permutation: perm,
selectedRows: idsOfSelectedRows,
colStates: {}
},
colStates = columnsState.colStates;
if (typeof (postData.filters) !== 'undefined') {
columnsState.filters = postData.filters;
}
for (i = 0; i < l; i++) {
colItem = colModel[i];
cmName = colItem.name;
if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') {
colStates[cmName] = {
width: colItem.width,
hidden: colItem.hidden
};
}
}
saveObjectInLocalStorage(myColumnStateName, columnsState);
};
var saveObjectInLocalStorage = function (storageItemName, object) {
if (typeof window.localStorage !== 'undefined') {
window.localStorage.setItem(storageItemName, JSON.stringify(object));
}
};
首先,我想提一下,旧答案中描述的代码并不总是正确的。为了解释该问题,您可以打开单行选择示例,并在重新加载网格之前 多次
使用列选择器。例如,您可以先打开列选择器,然后在“税”列之后更改“客户”列的位置。您将在网格中看到正确的结果。然后,您可以再次打开列选择器,然后将“日期”列移到“客户”列之后。您将按“金额”,“税收”,“客户”,“日期”,……的顺序查看各列。现在,您可以重新加载页面。您会看到重新加载的页面具有错误的列顺序:“客户”,“金额”,“税收”,“permutation``remapColumns
列相对于当前列顺序的整数位置 。这使保存列顺序更加复杂。一要保持 原来的 列顺序并重新计算总是从数值permutation
数组的重新排序
原 colModel
。
或者,可以保存列名,而不是保存相对于原始列模型而言具有更改的列位置的数组。换句话说应该更换permutation
的财产columnsState
喜欢的东西cmOrder
与网格中,其选用了用户最后一次列名的数组。
该方法remapColumnsByName
非常简单。它的工作原理与方法相同remapColumns
,但其第一个参数是列名数组,而不是整数索引数组。
是对单行选择演示的快速而肮脏的更改,以使用cmOrder
property代替permutation
property
columnsState
并remapColumnsByName
另外使用方法。如果您重复我在回答开始时描述的相同测试,您将看到新的演示版没有我之前描述的错误。
该演示最重要的部分与原始演示不同,您将在下面找到:
var getColumnNamesFromColModel = function () {
var colModel = this.jqGrid("getGridParam", "colModel");
return $.map(colModel, function (cm, iCol) {
// we remove "rn", "cb", "subgrid" columns to hold the column information
// independent from other jqGrid parameters
return $.inArray(cm.name, ["rn", "cb", "subgrid"]) >= 0 ? null : cm.name;
});
},
saveColumnState = function () {
var p = this.jqGrid("getGridParam"), colModel = p.colModel, i, l = colModel.length, colItem, cmName,
postData = p.postData,
columnsState = {
search: p.search,
page: p.page,
rowNum: p.rowNum,
sortname: p.sortname,
sortorder: p.sortorder,
cmOrder: getColumnNamesFromColModel.call(this),
selectedRows: idsOfSelectedRows,
colStates: {}
},
colStates = columnsState.colStates;
if (postData.filters !== undefined) {
columnsState.filters = postData.filters;
}
for (i = 0; i < l; i++) {
colItem = colModel[i];
cmName = colItem.name;
if (cmName !== "rn" && cmName !== "cb" && cmName !== "subgrid") {
colStates[cmName] = {
width: colItem.width,
hidden: colItem.hidden
};
}
}
saveObjectInLocalStorage(myColumnStateName(this), columnsState);
},
...
此外loadComplete
,恢复列顺序的回调如下
loadComplete: function () {
var $this = $(this), p = $this.jqGrid("getGridParam"), i, count;
if (firstLoad) {
firstLoad = false;
if (isColState && myColumnsState.cmOrder != null && myColumnsState.cmOrder.length > 0) {
// We compares the values from myColumnsState.cmOrder array
// with the current names of colModel and remove wrong names. It could be
// required if the column model are changed and the values from the saved stated
// not corresponds to the
var fixedOrder = $.map(myColumnsState.cmOrder, function (name) {
return p.iColByName[name] === undefined ? null : name;
});
$this.jqGrid("remapColumnsByName", fixedOrder, true);
}
if (typeof (this.ftoolbar) !== "boolean" || !this.ftoolbar) {
// create toolbar if needed
$this.jqGrid("filterToolbar",
{stringResult: true, searchOnEnter: true, defaultSearch: myDefaultSearch});
}
}
refreshSerchingToolbar($this, myDefaultSearch);
for (i = 0, count = idsOfSelectedRows.length; i < count; i++) {
$this.jqGrid("setSelection", idsOfSelectedRows[i], false);
}
saveColumnState.call($this, this.p.remapColumns);
},
我想重复一遍,新演示中的代码远非完美。我只是使用旧代码并对其进行了修复,以使其在免费的jqGrid中使用新remapColumnsByName
方法工作。
我们发现,再次使用GridUnload和grid load时,工具栏搜索将被完全删除: 此行已删除完成。
全部的 我试图在按下工具栏按钮[顶部寻呼机]时实现自定义警告消息,如“请选择行”。我不想使用警报!! 我遵循了Oleg的一个例子(至少对我来说是JqGrid大师!!)i、 e.Stackoverflow参考-jqGrid警告对话框。Oleg演示参考-http://www.ok-soft-gmbh.com/jqGrid/Warning.htm 如果我使用与Oleg演示中相同的版本,所有这些都可以正常
html5有数字输入类型,如 在这种情况下,输入时禁用非数字字符。触摸设备中自动显示纯本机数字键盘。 如何强制自由jqgrid字段编辑使用此类型? jgrid列定义为 jqrid是从远程json数据创建的。使用内联和表单编辑和搜索工具栏。这允许输入任何字符。在触摸设备全键盘出现。 如何解决此问题,以便在编辑和工具栏搜索中,此字段显示为属性? 如何指定输入仅为整数或允许小数点?可能是html5验证属
问题内容: 我试图将字符串分成数组并替换为,但无法做到,我也尝试了String.replaceAll这样的东西。 我想提供一个通往JNI的路径,并且它只能以这种方式读取。 问题答案: 在这种情况下不要使用- 这是用正则表达式指定的,这意味着您需要更多的转义。这应该很好: 请注意,由于Java字符串文字中的原因,反斜杠加倍-因此此处涉及的 实际 字符串是“单反斜杠”和“双反斜杠”-而不是双倍和四倍。
很多WordPress的付费插件是基于GPL协议的,于是就有人把这些插件弄到自己的网站提供免费下载,搜索“GPL Download”你能找到很多这种网站。它们给我们提供了免费试用WordPress付费插件的机会。 GPLDL gpldl.com是一个风格简洁,导航简单且信息清晰的网站,它有很多付费的插件和主题,以及WooCommerce的付费插件。 列举一些这个站点能免费下载到的WordPress
问题内容: 我需要传递给jqgrid,但找不到如何执行此操作的任何示例。这是我的尝试: 从服务器发送: 并在jqgrid中: 如何从jqgrid 发送和阅读? 编辑:我知道我正在被发送,因为我可以在Fiddler中看到它。我认为我只是停留在如何在客户端上阅读它。 问题答案: 通常,的用法非常简单。jqGrid支持您从服务器发送 将与jqGrid数据一起保存的 任何其他 数据。所以,如果jqGrid