升级到免费的jqGrid 4.11 - 使用edittype进行内联编辑:'选择'不传递select选项的值

时间:2015-12-17 11:20:20

标签: jquery jqgrid

网格将字段定义为:

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   .....

处理此问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

重要的是要理解网格中的数据格式必须与编辑格式相对应。您用于列Catalogue的输入数据是"KSCOPE370""KSCOPE369"之类的字符串,而不是ids 20642063。这意味着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而不是文本时使用,那么你应该

  1. 使用Catalogue中的ID代替文本填充网格。
  2. 应该使用formatter: "select"来显示文本而不是网格中的ID。
  3. 不能使用editoptions.dataUrl来提供ID和文本之间的映射,因为dataUrl请求将使用异步Ajax请求进行处理,但需要将地图用于填充网格。 formatter: "select"必须包含值。因此,必须使用editoptions.value而不是editoptions.dataUrlthe answerthis one中描述了问题的解决方案。它建议将editoptions.value值与网格的主要数据一起返回,并在beforeProcessing使用该值之前使用editoptions.value设置formatter: "select"。这种方法会进一步减少HTTP流量,因为每次编辑行时都不需要向dataUrl发出请求。
  4. 更新我已将the changes发布到GitHub,即使未定义value,也会将<option> formatter: "select"发送到服务器。它仍会使用text进行本地编辑。这些更改应该可以提高免费jqGrid与旧版jqGrid的兼容性。