【问题标题】:JqGrid sava row data to DB on click out of gridJqG​​rid sava 行数据在单击网格时发送到 DB
【发布时间】:2011-09-05 18:52:01
【问题描述】:

我有一个 3 列的 JQGrid。目前我已经实现了它,以便它是一个完全可编辑的网格(当你点击一行时,它会变得可编辑)。现在要离开编辑模式并保存我必须按回车,但我需要的是有可能:

当我在编辑模式下单击网格外以将我选择的行数据自动保存到数据库时,但我仍然希望在输入单击按钮功能时保持保存。

我不知道是否有可能实现,所以我在 1 个网格上同时拥有这两种功能。

这里是jqgrid的代码

  var lastsel;
  jQuery(document).ready(function() {
      jQuery("#list").jqGrid({
              url: '@Url.Action("SellerList")',
              datatype: 'json',
              mtype: 'GET',
              loadonce: true, // to enable sorting on client side
              sortable: true, //to enable sorting
              colNames: ['SellerKey', 'SellerId', 'Navn', 'Email', 'Slet'],
              colModel: [
                  { name: 'id ', index: 'id ', width: 50, key: true, editable: true, editrules: { edithidden: false }, hidden: true },
                  { name: 'SellerId', index: 'SellerId', align: 'center', width: 50, editable: true, editrules: { edithidden: false }, hidden: true },
                  { name: 'Navn', index: 'Navn', width: 200, edittype: 'text', align: 'left', editable: true, sortable: true },
                  { name: 'Email', index: 'Email', width: 300, edittype: 'text', align: 'left', editable: true, sortable: true },
                  { name: 'act', index: 'act', width: 80, align: 'center', sortable: false }],
              loadComplete: function() {
                  jQuery("#list").trigger("reloadGrid"); // Call to fix client-side sorting
              },
              gridComplete: function() {

                  var ids = jQuery("#list").jqGrid('getDataIDs');
                  var gr = jQuery('#list'); gr.setGridHeight('auto', true);
                  for (var i = 0; i < ids.length; i++) {
                      var cl = ids[i];
                     var be = "<a href='#' value='Slet' onclick=\"jQuery('#list').jqGrid('delGridRow','" + cl + "',{reloadAfterSubmit:false, url:'@Url.Action("deleteRow")'}); return false;\">Slet </>";
                      jQuery("#list").jqGrid('setRowData', ids[i], { act: be });
                  }
              },

              onSelectRow: function(id) {
                  if (id && id !== lastsel) {
                      jQuery('#list').jqGrid('restoreRow', lastsel);
                      jQuery('#list').jqGrid('editRow', id, true);
                      lastsel = id;
                  }
              },


              editurl: '@Url.Action("GridSave")',
              rowNum: 100,
              rowList: [5, 10, 20, 50],
              viewrecords: true


          });
      var grid = jQuery("#list"); 
        jQuery("#list").jqGrid('navGrid', "#page", { edit: false, add: false, del: false }, { beforeShowForm: function(form) {
              // "editmodlist"
              var dlgDiv = grid.jqGrid("#delmodlist" + grid[0].id);
              var parentDiv = dlgDiv.parent(); // div#gbox_list
              var dlgWidth = dlgDiv.width();
              var parentWidth = parentDiv.width();
              var dlgHeight = dlgDiv.height();
              var parentHeight = parentDiv.height();
              // TODO: change parentWidth and parentHeight in case of the grid
              //       is larger as the browser window
              dlgDiv[0].style.top = Math.round((parentHeight-dlgHeight)/2) + "px";
              dlgDiv[0].style.left = Math.round((parentWidth-dlgWidth)/2) + "px";
          }});
  }); 

【问题讨论】:

  • 如果用户点击(选择)另一行,您的意思是要保存当前编辑行吗?
  • 是的,或者如果用户点击网格外

标签: jqgrid


【解决方案1】:

如果您单击网格的另一行,要保存当前编辑行,您只需在 onSelectRow 事件处理程序中使用 saveRow 而不是 restoreRow

onSelectRow: function (rowid) {
    if (rowid !== lastSel) {
        grid.jqGrid('saveRow', lastSel);
        lastSel = rowid;
    }
    grid.jqGrid('editRow', rowid, true);
    return true;
}

如果您单击网格之外的某处来保存该行,我没有找到任何好的解决方案。例如,在 IE9 中,以下代码运行良好:

grid.focusout(function (e) {
    if (e.relatedTarget) {
        var $related = grid.find(e.relatedTarget);
        if ($related.length <= 0 && lastSel) {
            grid.jqGrid('saveRow', lastSel);
        }
    }
});

在哪里var grid = jQuery("#list"); 请参阅演示 here。相同的代码在其他网络浏览器中不起作用。对于IE8/IE7,e.pageXe.pageY会在focusout中设置(但在IE9中没有),所以可以通过属性来计算鼠标的位置,判断鼠标位置是否在网格之外。

所以我无法建议您在单击网格外部时保存编辑行的任何好方法。

【讨论】:

  • 它有效,再次感谢 Oleg。抱歉回复慢,之前没来得及测试
  • 在网格外部单击时会这样吗? var lastsel = ""; $('body').bind('click', function(e) { if ( lastsel != "" ) { //if a row is selected for edit if($(e.target).closest('#commonDocumentsSearchResultsGrid').length == 0) { //and the click is outside of the grid //save the row being edited and unselect the row $searchResultsGrid.jqGrid('saveRow', lastsel); $searchResultsGrid.resetSelection(); lastsel=""; } } });
  • 嗨@Oleg 不确定这是否需要一个新问题,但我正在使用此答案的onSelectRow 部分。我知道这是一个很老的答案,所以想检查一下这是否仍然有效?我准备了一个小提琴here 如果我尝试打印该行,它没有更新的数据。如果我尝试保存它,也会发生同样的情况。 free-jqgrid 代码中是否有任何可能导致此问题的更改?或者我做错了什么?
  • 嗨@DipenShah:我认为答案真的很老了。我最好使用$(window).click 并测试点击的元素是否在网格内。例如,您可以使用jQuery.contains。如果您检测到用户在网格外单击,您可以调用 saveRow 来保存该行。
  • 对不起@Oleg 我想你误解了我的问题。我想要做的是,如果用户单击另一行,则应保存正在编辑的当前行。那是我应该使用onSelectRow 的部分,我认为您指的是第二部分,如果用户在网格外部单击,则保存该行。
【解决方案2】:

我发现 icats 的答案很有用,但并非在所有情况下都有效。

我建议绑定到$('html') 而不是$('body')。正文可能不会占用浏览器中的所有可见空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多