【发布时间】:2013-11-01 21:53:47
【问题描述】:
我在我的 Web 应用程序中使用 jqgrid。使用 iOS 7,当我选择 jqgrid 表中的所有行并尝试将我的编辑保存到数据库中时,它不会保存。 如果我只是编辑一行然后保存然后编辑另一行 - 基本上如果我一次编辑一行 - 那么它就可以工作。只是多行编辑不起作用。而且它只在 iOS 7 上不起作用。
我已经看过这个帖子了:http://www.trirand.net/forum/default.aspx?g=posts&m=13688 我已将我的 jqgrid 更新到最新版本 (4.5.4),但在 iOS 7 上我仍然遇到同样的问题。
这里是提交记录的javascript:
function submitChange(tabId) {
if (!submitFlag) return;
var records=[];
var $t = $("#" + tabId);
var selectedIds = $t.jqGrid('getGridParam','selarrrow');
var postData = $t.jqGrid("getGridParam", "postData");
if (selectedIds.length > 0) {
for (var i=0; i < selectedIds.length; i++){
updatedList[selectedIds[i]] = composeEditedRecord(selectedIds[i]); //Put edited record into updatedList
}
} else {
alert($T('missing.msg'));
return;
}
var z = 0;
for (var key in updatedList) {
if (typeof(updatedList[key].endDate) != 'undefined'
&& typeof(updatedList[key].endTypeId) != 'undefined') {
records[z] = updatedList[key];
z++;
} else {
alert($T('missing.msg'));
return;
}
}
if (records.length < $t.jqGrid('getGridParam', 'records')) {
alert($T('missing.msg'));
return;
}
$.extend(postData, {'updatedList': JSON.stringify(records)});
$.post('mse/end', postData, function(data) {
history.go(-1);
});
}
jquery 版本也是 1.5.1。
<link type="text/css" rel="stylesheet" href="css/jquery-ui-1.8.10.custom.css" />
<link type="text/css" rel="stylesheet" href="css/ui.jqgrid.css" media="screen" />
<link type="text/css" rel="stylesheet" href="css/ui.jqgrid.custom.css" media="screen" />
<script src="jquery/jquery.js" type="text/javascript" ></script>
<script src="jquery/ui/jquery-ui.js" type="text/javascript" ></script>
<script src="jquery/plugins/validate/jquery.validate.js" type="text/javascript" ></script>
<script src="jquery/plugins/jqgrid/i18n/grid.locale-en.js" type="text/javascript"></script>
<script src="jquery/plugins/jqgrid/jquery.jqGrid.min.js" type="text/javascript"></script>
这里是composeEditedRecord函数:
function composeEditedRecord(id) {
var tmp = getEditableCells('mseTableEnd', id);
var editedRecord = updatedList[id];
if (!editedRecord) {
editedRecord = {};
editedRecord['id'] = id;
}
for (var key in tmp) {
if (key == 'tag')
editedRecord['TagPattern'] = tmp[key];
else
editedRecord[key] = tmp[key];
}
return editedRecord;
}
这里是jqGrid的定义:
$("#mseTableEnd").jqGrid({
url: 'mse/list.json',
sortname: 'guisid',
colNames: mse.columnDisplayNames,
colModel: mse.colModelDef,
postData: filterValues,
onSelectRow: function(id,status){
if(status == true) {
$('#mseTableEnd').jqGrid('editRow',id,true);
$('#jqg_mseTableEnd_' + id).focus();
} else if(status == false) {
var tmp = getEditableCells('mseTableEnd', id);
var record = composeEditedRecord(id);
updatedList[id] = record; //Put edited record into updatedList when unchecked
$('#mseTableEnd').jqGrid('restoreRow',id);
$('#mseTableEnd').jqGrid('setRowData',id, tmp);
}
},
onSelectAll: function(aRowids, status) {
if (status){
for (var i = 0; i < aRowids.length; i++)
$('#mseTableEnd').jqGrid('editRow',aRowids[i],true);
$('#jqg_mseTableEnd_' + aRowids[i-1]).focus();
} else {
for (var i = 0; i < aRowids.length; i++) {
var tmp = getEditableCells('mseTableEnd', aRowids[i]);
var record = composeEditedRecord(aRowids[i]);
updatedList[aRowids[i]] = record; //Put edited record into updatedList when unchecked
$('#mseTableEnd').jqGrid('restoreRow',aRowids[i]);
$('#mseTableEnd').jqGrid('setRowData',aRowids[i], tmp);
}
}
},
gridComplete: function() {
$("#mseTableEnd").setColProp('tag',{editable:false});
var columnsToHide = [];
for (var i = 0; i <mse.colModelDef.length; i++) {
if (i > 12) columnsToHide.push(mse.colModelDef[i].name);
}
columnsToHide.push('generation');
$("#mseTableEnd").jqGrid('hideCol', columnsToHide);
$("#mseTableEnd").jqGrid('showCol', ['enddate' 'comment']);
},
loadComplete: function() {
var ids = $('#mseTableEnd').jqGrid('getDataIDs');
for (var i = 0; i < ids.length; i++) {
$('#mseTableEnd').setSelection(ids[i]); // All selected by default
$('#'+ids[i]+' a').click(function(e) {
var myHash = e.currentTarget.hash; // string like "#?id=0"
if (myHash.substring(0,5) === '#?id=') {
var id = myHash.substring(5,myHash.length); // getting row Id
var url = appContext.contextPath + '/mse/edit.do?mseId=' + id;
hasPermissionByIds('Mse', id, 1, gotoPage, url);
}
e.preventDefault();
});
}
}
});
这里是getEditableCells函数:
function getEditableCells(tabId, rowId) {
var $t = $("#" + tabId);
var ind = $t.jqGrid("getInd",rowId,true);
var cm, nm, tmp={};
$("td",ind).each(function(i) {
cm = $t.jqGrid('getGridParam', 'colModel')[i];
nm = cm.name;
if ( nm != 'cb' && nm != 'subgrid' && cm.editable===true && nm != 'rn') {
if (cm.edittype == "text") {
if ($("input, textarea",this).length > 0)
tmp[nm]=$("input, textarea",this).val();
else {
var rowData = $t.jqGrid('getRowData', rowId);
tmp[nm]=rowData[nm];
}
}
}
});
return tmp;
}
谁能帮帮我?
【问题讨论】:
-
jqGrid 没有在数据库中保存多行的功能。因此,您应该在问题的文本中附加 JavaScript 代码,以显示您的具体操作。
-
代码中没有jqGrid的定义。目前尚不清楚您使用的是哪个
datatype,以及您是否使用loadonce: true。您使用哪种编辑模式也不清楚。此外,您使用未在发布的代码中定义的composeEditedRecord函数和updatedList变量。你能扩展发布的代码吗? -
你贴的代码还是有很多不清楚的地方。我要求您包含显示如何检测已编辑行的代码。现在在另一个未定义函数
getEditableCells中的部分。 您无需发布所有代码。调试代码是您的问题。你应该准备一个小例子来重现你有问题的问题。例如,哪个关系隐藏了gridComplete中的某些列?您使用colModel: mse.colModelDef, postData: filterValues发布代码,它不提供任何信息,但使用代码中某些列的名称。 -
您的代码包含长代码,其中包含大量对不清楚的列名的引用(
endDate和endTypeId)。您写了关于在 iOS 7 上保存数据库行的问题,但您只是没有验证updatedList是否已填充。您使用非常旧版本的 jQuery (1.5.1),没有写任何关于更新版本(如 1.10.2 或 2.0.3)的测试,也没有写关于其他操作系统和 Web 浏览器的测试。抱歉,但你应该更好地准备你的问题。
标签: jquery jqgrid rows multi-select