【问题标题】:jqGrid Multiple row editing doesn't save to database in iOS7jqGrid多行编辑不保存到iOS7中的数据库
【发布时间】: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 发布代码,它不提供任何信息,但使用代码中某些列的名称。
  • 您的代码包含长代码,其中包含大量对不清楚的列名的引用(endDateendTypeId)。您写了关于在 iOS 7 上保存数据库行的问题,但您只是没有验证 updatedList 是否已填充。您使用非常旧版本的 jQuery (1.5.1),没有写任何关于更新版本(如 1.10.2 或 2.0.3)的测试,也没有写关于其他操作系统和 Web 浏览器的测试。抱歉,但你应该更好地准备你的问题。

标签: jquery jqgrid rows multi-select


【解决方案1】:

感谢您的帮助。 我把getEditableCells函数放在帖子里了。

我们发现问题出在 getEditableCells 函数中的这些行:

if ($("input, textarea",this).length > 0)
 tmp[nm]=$("input, textarea",this).val();

如果我们把文字改成这样:

if ($("input",this).val().length > 0)
 tmp[nm]=$("input",this).val();

然后它解决了这个问题,但是当我取消选择并重新选择复选框时,会导致 html 被插入到网格表的文本字段中。也许我的 jquery 语法有问题?

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多