【发布时间】:2011-11-24 01:21:52
【问题描述】:
我正在使用带有 EF4 和 ASP.NET Web 窗体的开源 jqGrid 插件。我需要根据数据库中的列值在可内联编辑的网格行中设置一个输入元素。例如,第一行可以包含 DDL,第二行可以包含复选框等。
我正在尝试使用custom_element 和custom_values 来实现这一点,如下所示:
$("#grid1").jqGrid({
url: 'Default.aspx/getGridData',
datatype: 'json',
...
colModel: [
...
//contains the input type ('select', etc.)
{ name: 'InputType', hidden:true },
...
//may contain a string of select options ('<option>Option1</option>'...)
{
name: 'Input',
editable:true,
edittype:'custom',
editoptions:{
custom_element: /* want cell value from InputType column here */ ,
custom_value: /* want cell value from Input column here */
}
},
...
]
});
jqGrid docs 说我可以调用自定义函数来设置custom_element 和custom_values,但是我看不到如何捕获列值并将它们传递给我的自定义函数。
对于设置custom_values,我确实注意到Oleg's nice solution 使用list: 参数,但这似乎涉及额外的Ajax 调用。我想避免这种情况,因为我已经从网格的初始 Ajax 调用中获得了所需的所有数据。
总而言之,我需要在内联编辑模式下执行以下操作:
- 从 DB 值动态分配输入类型
- 从 DB 字符串动态分配输入值(用于 DDL 或复选框)
我也愿意跳过使用custom_element和custom_values,但是我仍然面临动态设置edittype和editoptions:{value:}参数的同样问题。
关于如何做到这一点的任何想法?我应该采取其他方法吗?
更新:感谢您为我提供的帮助。根据请求,这是我的 JSON 响应的简短示例:
{"d":[
{"Input":null,"InputType":"select"},
{"Input":"From downtown, proceed west on Interstate 70.", "InputType":"text"}
]}
有了这些数据,我想在一行中显示一个空选择,并在下一行显示一个填充的文本字段。两者都是可编辑的内联。
解决方案:我回到这个问题是为了找到一个不涉及使用custom_element 和custom_values 的解决方案。这是我的解决方案(基于下面的accepted answer)更改edittype 和editoptions:
loadComplete: function () {
var rowIds = $("#grid1").jqGrid('getDataIDs');
$.each(rowIds, function (i, row) {
var rowData = $("#grid1").getRowData(row);
if (rowData.InputType == 'select') {
$("#grid1").jqGrid('restoreRow', row);
var cm = $("#grid1").jqGrid('getColProp', 'Input');
cm.edittype = 'select';
cm.editoptions = { value: "1:A; 2:B; 3:C" };
$("#grid1").jqGrid('editRow', row);
cm.edittype = 'text';
cm.editoptions = null;
}
});
}
Nota Bene:对我来说重要的一件事是记住在调用editrow 后将editoptions 设置回null。此外,正如 Oleg 在 cmets 中提到的,避免使用自定义元素使我可以轻松实现 datepicker 输入。这对我的应用很重要,所以我最终接受了 Oleg 的回答,但我仍然支持 Walter 的回答。如果这是不好的形式,我真诚地道歉。我只是想奖励最适合我的解决方案。
【问题讨论】:
-
您写道“我已经从最初的 Ajax 调用网格中获得了我需要的所有数据”。您能否提供一个您使用的 JSON 数据示例?这样人们就可以看到您发送信息的格式。
-
@Oleg:已更新问题以包含 JSON 响应。
-
Oleg 和 Walker 的答案在实用性方面几乎相同。我接受沃尔特的回答主要是因为它是最先发布的。我应该提到,我非常感谢 Oleg 的其他 jqGrid 答案,一旦我获得足够的 SO 积分,我将慷慨地支持这些答案。
-
接受沃尔特的回答是个好主意。尽管如此,我是完美主义者,我知道如果您使用自定义编辑,您可能会遇到一些额外的问题。主要规则是:如果你能找到没有自定义编辑的解决方案,你就不应该使用它。在您阅读了
onSelectRow处理程序中的ElementType值之后,您可以使用var cm = grid.jqGrid('getColProp','FullName');获取列属性并更改cm.edittype和cm.editoptions之前 调用editRow。以这种方式,您将拥有最标准的编辑控件。 -
查看the answer,它描述了使用 jQuery UI 自动完成和自定义编辑的问题。自定义控件将放置在具有
id的<span>中,而您手动创建的<input>(请参阅Walter 的答案)具有no id。所以在当前的实现中,自动完成功能将不起作用。如果您只使用标准的edittype='text',您可以使用自动完成或日期选择器,而无需任何额外的工作。
标签: c# asp.net jquery-plugins jqgrid