JQGrid:如何在编辑后刷新下拉菜单?

在我的应用程序中,我使用JQGrid来加载一些联系人数据,当我编辑/添加一个条目时,我从数据库中select联系人的名字,然后更新/添加联系人。

我的问题是,当我点击提交button,我想刷新下拉列表和已经input从下拉列表dispaear的数据。

我的代码:

为colModel:

{ name: 'OwnerEmail', index: 'OwnerEmail', width: 200, align: "center", sortable: true, sorttype: 'text', editable: true, edittype: 'select', editrules: { required: true }, editoptions: { value: ownersList} }, 

我填充下拉select行(当我select一个行,下拉将刷新)

 onSelectRow: function (id) { var advOwners = $.ajax({ type: 'POST', data: {}, url: 'MyWebService.asmx/GetOwners', async: false, error: function () { alert('An error has occured retrieving Owners!'); } }).responseXML; var aux = advOwners.getElementsByTagName("string"); ownersList = ""; for (var i = 0; i < aux.length; i++) { ownersList += aux[i].childNodes[0].nodeValue + ':' + aux[i].childNodes[0].nodeValue + '; '; } ownersList = ownersList.substring(0, ownersList.length - 2); jQuery("#GridView").setColProp('OwnerEmail', { editoptions: { value: ownersList} }); } 

但是,当我再次input编辑/添加表单时,下拉菜单不会刷新,它具有已经加载的项目。

任何帮助?

谢谢,杰夫

我认为如果你使用dataUrl属性而不是使用value属性会更好。 在这种情况下,您将不需要使用onSelectRow同步Ajax调用手动获取select数据。 如果数据将需要相应的调用将为您做jqGrid。

dataUrl的URL应该返回包含所有<options> <select>元素的HTML片段。 因此,您可以将dataUrl任何其他响应转换为实现相应的buildSelectcallback函数所需的格式。

在你的地方,我宁愿从“MyWebService.asmx / GetOwners”URL中返回JSON数据,而不是你目前正在做的XML数据。 在最简单的情况下,它可能是networking方法

 [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List<string> GetSelectData() { return new List<string> { "User1", "User2", "User3", "User4" }; } 

如果您使用HTTP GET而不是HTTP POST,则应通过在HTTP标头中设置Cache-Control: private, max-age=0来阻止使用caching中的数据。 相应的代码将会是

 [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public List<string> GetSelectData() { HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0)); return new List<string> { "User1", "User2", "User3", "User4" }; } 

默认情况下,jqGrid在相应的Ajax调用中使用dataType: "html" (请参阅源代码 )。 要将行为更改为dataType: "json", contentType: "application/json"您应该另外使用ajaxSelectOptions参数作为

 ajaxSelectOptions: { contentType: "application/json", dataType: 'json' }, 

或如

 ajaxSelectOptions: { contentType: "application/json", dataType: 'json', type: "POST" }, 

如果您将使用默认用于ASMX Web服务的HTTP POST。

colModel的列的相应设置将会是

 edittype: 'select', editable: true, editoptions: { dataUrl: '/MyWebService.asmx/GetSelectData', buildSelect: buildSelectFromJson } 

哪里

 var buildSelectFromJson = function (data) { var html = '<select>', d = data.d, length = d.length, i = 0, item; for (; i < length; i++) { item = d[i]; html += '<option value=' + item + '>' + item + '</option>'; } html += '</select>'; return html; }; 

请注意,上述代码使用ASMX Web服务时所需的data.d 如果你想迁移到ASP.NET MVC或WCF,你将需要删除d属性的使用和直接使用data

更新 : 在这里你可以下载VS2010演示项目,它实现了我上面写的。