我在可编辑单元格上验证数据时遇到问题。我根据这些单元格的值使一列的某些单元格可编辑。这是网格的代码:
jQuery("#cart").jqGrid({
datatype: 'local',
autowidth: true,
height: tabHeight,
gridview: true,
shrinkToFit: true,
autoencode: true,
loadtext: "იტვირთება",
multiselect: true,
idPrefix:"b",
colNames: ['დასახელება', 'რაოდენობა მინ.', 'რაოდენობა მაქს.', 'პოზიცია', 'რაოდენობა', 'ფასი'],
colModel: [{
name: 'asktx',
index: 'asktx',
width: 40,
sorttype: "string",
},
{
name: 'menge_min',
index: 'menge_min',
width: 30,
sorttype: "number",
hidden: true
},
{
name: 'menge_max',
index: 'menge_max',
width: 30,
sorttype: "number",
hidden: true
},
{
name: 'srvpos',
index: 'svrpos',
hidden: true
},
{
name: 'menge',
index: 'menge',
width: 30,
sorttype: "number",
editrules: {
required: true, number: true, custom: true, custom_func: checkInterval
},
editable: true,
},
{
name: 'price',
index: 'price',
width: 30,
sorttype: "string",
search: false,
}],
viewrecords: true,
caption: "არჩეული მომსახურებები",
gridComplete: function () {
var $this = $(this), ids = $this.jqGrid('getDataIDs'), i, l = ids.length;
for (i = 0; i < l; i++) {
var rowData = jQuery(this).getRowData(ids[i]);
if (rowData.menge_min != rowData.menge_max && !rowData.menge) {
menge_min = rowData.menge_min;
menge_max = rowData.menge_max;
$this.jqGrid('editRow', ids[i], true);
}
}
}
});
我正在使用gridComplete
来检查两个单元格的值是否相等,如果它们不相等,我将在该行中制作一个名为"menge"
可编辑的列。我还对常量值进行了验证,例如,如果我需要检查此 menge 值是否在 a 和 b 之间,我可以这样做并且一切都很好,尽管现在我需要根据隐藏的 "menge_min"
和"menge_max"
字段值的值验证该字段值。我看到自定义函数"checkInterval"
只能有两个参数,所以我不能在那里传递行 ID。有什么方法可以获取有关当前在自定义验证函数中编辑的行的某种信息?
我根据另一个网格上的单击事件填充网格,这是现在的验证功能:
var checkInterval = function (value, colname) {
value = parseInt(value);
mange_min = parseInt(menge_min);
menge_max = parseInt(menge_max);
if (value < menge_min || value > menge_max) {
return [false, "რაოდენობა უნდა იყოს " + menge_min + "-" + menge_max + " ინტერვალში"];
} else {
return [true];
}
}
至于多个可编辑行,这是一种要求,如果没有验证错误弹出窗口,用户知道他/她输入了正确的值并继续编辑其他行。jqGrid 版本是 4.5.1。
下面是另一个网格的选择事件:
onSelectRow: function (id) {
if (id && id !== lastSel) {
jQuery(this).restoreRow(lastSel);
lastSel = id;
var celValue = jQuery(this).getRowData(id);
var rowCount = $("#cart").getGridParam("reccount") + 1;
if (celValue.menge_min == celValue.menge_max )
celValue.menge = celValue.menge_min;
var newID = id + rowCount;
jQuery("#cart").jqGrid('addRowData', newID, celValue);
}
}
我看到您的问题是访问回调内menge_min
列中的menge_max
内容custom_func
。
您当前的代码设置menge_min
,并menge_max
网格最后一行的值。gridComplete
内部的循环会覆盖变量的值。
我建议您不要开始多行的编辑模式。它会产生许多问题。例如,可以修改行,但不能保存行。排序和筛选(搜索)在网格中被阻止。只有在保存所有行中的更改后才能使用该可能性。通常,一个实现在单击网格的任何单元格时开始编辑。用户看到编辑的开始,他/她可以按 Enter 保存数据。在编辑行之间,用户可以对网格进行排序或筛选(您可以添加调用filterToolbar
方法来创建筛选器栏)。以这种方式,用户可以轻松找到请求的数据行,然后编辑数据。
您当前使用的版本 4.5.1 非常旧。它大约在 3 年前出版。您没有例外的回调 custom_func
,您可以使用该回调,因为您可以同时编辑多行。
解决问题的最简单方法是更新到免费的 jqGrid 4.13.0。Free jqGrid 是我从 2014 年底开始开发的 jqGrid 的分支。它有你需要的魔法。我实现了指定自定义验证的替代方法。代替用法custom: true, custom_func: checkInterval
可以使用custom: checkInterval
代替(custom
属性不是布尔值,而是回调函数)。在这种情况下,custom
回调将获得一个参数options
,其中包含许多可以使用的属性。此处介绍了这些属性(有关其他信息,请参阅注释)。您可能需要options.rowid
并使用var item = $(this).jqGrid("getLocalRow", options.rowid);
来获取可以使用item.menge_max
和item.menge_min
的完整数据项。
此外,我建议您在onSelectRow
或父网格中使用addRow。您可以使用initdata
选项指定网格的数据,而不指定rowID
。addRow
的文档错误地描述了默认值rowID
。rowID
的默认值是 null
,即使对于 4.5.1 版本(请参阅代码行),jqGrid 在这种情况下也会自动生成唯一的 rowid。然后,您可以从gridComplete
中删除代码。如果要在选择网格中的行时实现内联编辑的开始,则用户可以不受任何限制地执行所需的所有操作。
最后一句话。如果要迁移到空闲的 jqGrid,则可以从网格中删除menge_min
、menge_max
和svrpos
列。取而代之的是,您可以使用 additionalProperties: ["menge_min", "menge_max", "svrpos"]
.它通知免费的 jqGrid 将属性的值保存在本地数据中,但不会将信息放在网格的某些隐藏单元格中(页面的 DOM 中没有不需要的信息)。
您可以以任何方式从colModel
中删除不需要的sorttype: "string"
和index
属性。