【问题标题】:How to show row in view mode if action button is pressed in jqgrid if single click starts edit如果单击开始编辑,如果在 jqgrid 中按下操作按钮,如何在视图模式下显示行
【发布时间】:2011-08-27 20:49:29
【问题描述】:

jqGrid 内联编辑在单击下面的 onSelectRow 事件时开始。 保存和取消操作按钮已打开。

保存或取消按钮单击不会结束内联编辑。单击这些按钮后,行仍处于编辑模式。 看起来按钮单击会导致 onSelectRow 事件重新开始内联编辑。

如何在单击保存或取消操作按钮时结束单击内联编辑?

$(function () {
    var grid = $("#grid");
    grid.jqGrid({
          colModel: [{"name":"_actions","width":45,"formatter":"actions",
          "formatoptions":{"keys":true,"delbutton":false,"afterSave":function (rowID, response) {
                  cancelEditing($('#grid'));
                  aftersavefunc(rowID, response);
            }
,"onError":errorfunc
,"onEdit":function (rowID) {
       if (typeof (lastSelectedRow) !== 'undefined' && rowID !== lastSelectedRow)
                       cancelEditing($('#grid'));
                       lastSelectedRow = rowID;
       }
}},
...
},

       onSelectRow: function (rowID) {
        lastSelectedRow = rowID;
    $("tr#" + lastSelectedRow + " div.ui-inline-edit, " + "tr#" + lastSelectedRow + " div.ui-inline-del").hide();
    $("tr#" + lastSelectedRow + " div.ui-inline-save, " + "tr#" + lastSelectedRow + " div.ui-inline-cancel").show();
    $("#grid").jqGrid('editRow', lastSelectedRow );
  }
}


function cancelEditing(myGrid) {
    if (typeof lastSelectedRow !== "undefined") {
        myGrid.jqGrid('restoreRow', lastSelectedRow);
  var lrid = lastSelectedRow;
  $("tr#" + lrid + " div.ui-inline-edit").show();
  $("tr#" + lrid + " div.ui-inline-save, " + "tr#" + lrid + " div.ui-inline-cancel").hide();
    }
}
}

更新

网格包含工具栏中的复选框,用于切换快速数据输入(自动编辑)的单击编辑模式:

            onSelectRow: function (rowID) {
              if (!autoedit) {
                if (typeof (lastSelectedRow) !== "undefined" && lastSelectedRow !== rowID)
                  cancelEditing ($(this));
                  return;
                  }
                  beginInlineRowEdit(rowID);
             },

即使在这种模式下,也可以选择文本并将其复制到剪贴板。问题是在单击模式下单击保存和取消按钮不会终止内联编辑,也许这个单击被解释为开始编辑命令。如果在操作列中单击并且在这种情况下不开始内联编辑,如何检查 onSelectRow,使操作列不开始内联编辑或其他想法?

更新2

我试过了

           beforeSelectRow: function (rowID,e) {
            alert( $(e.target).html());

}

如果单击编辑按钮消息框为空。如果在复选框复选标记列之外单击,它也是空的。如果单击外部编辑按钮,它将包含整个网格 html。 如何在操作列中检测点击?

更新 3

按照奥列格的建议,我尝试过

beforeSelectRow: function (rowID,e) { 
   if (!jqgrid_beforeSelectRow( rowID, e)) return false;
   beginInlineEdit(rowID, aftersavefunc );
   return true;
              }


function beginInlineEdit(rowID, afterSave) {
    var grid2 = $("#grid");
    if (rowID && rowID !== lastSelectedRow) {
        var scrollPosition = $("#grid").closest(".ui-jqgrid-bdiv").scrollLeft();
        cancelEditing($("#grid"));
        lastSelectedRow = rowID;
        setTimeout(function () {
            grid2.closest(".ui-jqgrid-bdiv").scrollLeft(scrollPosition);
        }, 100);
    }
    $("tr#" + lastSelectedRow + " div.ui-inline-edit, " + "tr#" + lastSelectedRow + " div.ui-inline-del").hide();
    $("tr#" + lastSelectedRow + " div.ui-inline-save, " + "tr#" + lastSelectedRow + " div.ui-inline-cancel").show();

    $("#grid").jqGrid('editRow', lastSelectedRow, true, null, null, null,
                 { _dokdata: FormData },
                 afterSave,
                 errorfunc,
                 function () {  // afterrestorefunc
                     cancelEditing($("#grid"));
                     setFocusToGrid();
                 }
             );
}

jqgrid_beforeSelectRow = function (rowID, e) {
    if ($(e.target).hasClass('ui-icon-cancel')) { return false; }
    if ($(e.target).hasClass('ui-icon-disk')) { return false; }
    if (typeof (lastSelectedRow) !== "undefined" && lastSelectedRow !== rowID)
      cancelEditing($("#grid"));
    return true;
}

function cancelEditing(myGrid) {
    if (typeof lastSelectedRow !== "undefined") {
        myGrid.jqGrid('restoreRow', lastSelectedRow);
        restoreActionsIcons();
    }
}

使用常规双击开始编辑。在产品网格第一行编辑按钮仅第一次启动 edi。按下保存按钮后,编辑按钮中的剩余点击将被忽略,内联编辑不会开始。仅当产品表中的第一行时才会发生这种情况。在底部行编辑可以开始多次。如何解决这个问题?

【问题讨论】:

    标签: jqgrid


    【解决方案1】:

    如果我理解您的问题是正确的,则用户必须在选择行后按 Esc,如果用户不想编辑该行,则单击“取消”操作按钮。

    我曾经使用网格,它不仅用于编辑,还用于查看。所以我个人更喜欢使用ondblClickRow而不是onSelectRow进入内联编辑模式。在这种情况下,用户可以选择或只需单击行或将网格中的一些数据复制到剪贴板。如果用户需要编辑行,用户可以使用任一操作按钮的双击。

    【讨论】:

    • 谢谢。我更新了问题。我正在尝试单击编辑模式,看看是否合理。它通过节省大量鼠标点击来提高数据输入速度。
    • @Andrus:我不太了解您描述的效果,但我想您需要在beforeSelectRow 事件处理程序内部实现一些检查,其中e 作为第二个参数。 e.target 是单元格 (<td>) 或其被点击的子元素。如果要阻止行选择,可以返回 false。顺便说一句,您可以将您当前在onSelectRow 中的代码移动到beforeSelectRow。在这种情况下,您将拥有可以使用的附加信息 (e.target)。
    • @Andrus:您可以对以下if ($(e.target).hasClass('ui-icon-cancel')) { return false;} 执行以下操作,以防止在单击“取消”操作按钮时选择行。
    • @Andrus:在我的测试中,单击 disabled 控件(如禁用复选框)什么也不做。某些浏览器 (IE) 会向前双击禁用的元素。仅单击禁用元素的外部,但在单元格内部将明确触发单击事件。你原来的问题是点击动作按钮。为什么要检查禁用元素的点击?
    • @Andrus:如果你真的需要这种行为,点击禁用的复选框应该开始内联编辑,你应该不使用禁用的复选框。取而代之的是,您可以保存复选框的图像并使用自定义格式化程序来显示伪复选框。可能还有一些其他技巧如何说浏览器在禁用控件上调用click 事件处理程序,但我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多