网格将字段定义为:
colModel: [
{name:'Catalogue', index:'catalogue.Catalogue', width:100, align:"left",
editable:true, edittype:'select',
editoptions: {dataUrl:'xtras/selectOptions.php?optionFunction=CatalogueSelect'}
},
带有内联编辑html代码的构建网格显示:
<select class="editable" id="23368_Catalogue" name="Catalogue" size="1">
<option value="0">Select</option>
<option value="2064">KSCOPE370</option>
<option value="2063">KSCOPE369</option>
...
</select>
我希望网格传递到select
的服务器值,例如[Catalogue] => 2064
,但网格会发送到服务器:
[Catalogue] => KSCOPE370
如果我添加到列定义formatter:'select',
- 它会发送正确的2064
值,但是如果我尝试内联编辑,则取消它 - Catalogue
字段的可见值在前看不见:
是:
Catalogue ISRC ...
KSCOPE370 GBCQV0200197 .....
取消编辑后,变为:
Catalogue ISRC ...
GBCQV0200197 .....
处理此问题的正确方法是什么?
答案 0 :(得分:1)
重要的是要理解网格中的数据格式必须与编辑格式相对应。您用于列Catalogue
的输入数据是"KSCOPE370"
和"KSCOPE369"
之类的字符串,而不是ids 2064
或2063
。这意味着jqGrid保持"KSCOPE370"
,但这意味着新修改的数据必须采用保存格式:字符串而不是ID。
如果尝试在编辑后尝试在网格中保存值2064
,则当前代码将失败。它会在本地保存KSCOPE370
并将Catalogue=KSCOPE370
发送到服务器,因为您未向列formatter: "select"
指定Catalogue
。如果调试代码,可以看到新值将正确保存在网格中,但是在服务器端有问题。您的服务器代码似乎需要id而不是文本,并且无法处理数据Catalogue=KSCOPE370
。您可以在.trigger("reloadGrid", [{current: true}])
内联编辑中使用aftersavefunc
来重新加载网格。重新加载网格后将显示空文本。
jqGrid提供两个主要选项:文本的使用和id的使用。通常,一个人拥有保存查找数据的数据库表。我个人创建查找表总是使用id的IDENTITY
(或AUTO_INCREMENT)列和带有文本的列。另外,我在文本上始终创建UNIQUE CONSTRAINT。它允许确保不仅可以通过id获取文本,而且如果需要则可以通过文本获取id。因此,在填充和编辑网格时可以轻松使用文本。无论何时需要,都可以在服务器端按名称重新分配id值。
如果真的需要在使用id而不是文本时使用,那么你应该
Catalogue
中的ID代替文本填充网格。formatter: "select"
来显示文本而不是网格中的ID。editoptions.dataUrl
来提供ID和文本之间的映射,因为dataUrl
请求将使用异步Ajax请求进行处理,但需要将地图用于填充网格。 formatter: "select"
必须包含值。因此,必须使用editoptions.value
而不是editoptions.dataUrl
。 the answer或this one中描述了问题的解决方案。它建议将editoptions.value
值与网格的主要数据一起返回,并在beforeProcessing
使用该值之前使用editoptions.value
设置formatter: "select"
。这种方法会进一步减少HTTP流量,因为每次编辑行时都不需要向dataUrl
发出请求。 更新我已将the changes发布到GitHub,即使未定义value
,也会将<option>
formatter: "select"
发送到服务器。它仍会使用text
进行本地编辑。这些更改应该可以提高免费jqGrid与旧版jqGrid的兼容性。