【问题标题】:jqGrid - Inline edit - Detect dirty / changed cellsjqGrid - 内联编辑 - 检测脏/更改的单元格
【发布时间】:2011-06-15 15:46:25
【问题描述】:

有没有使用 jqgrid 的 getChangedCells 的例子 判断数据是否发生变化的方法?

我在可下载的演示中使用了 getChangedCells jqgrid,只能找到函数定义,没有 getChangedCells 的示例用法。

我想要做的是保存用户的编辑 如果用户单击另一行,则生成。但是,我只 如果该行是脏的,想提交保存。

提前致谢, --内特

【问题讨论】:

  • +1 这是个好问题。
  • 说真的,这是一个!我希望有更多的选票给你:(

标签: jqgrid inline-editing


【解决方案1】:

行上没有安全的脏标志。您可以使用在行编辑开始时(inline editing mode 开始处)方法editRoweditable="1" 属性添加到网格行(<tr> 元素)的事实。后来saveRowrestoreRow 方法将属性值更改为editable="0"。因此,当前页面中至少一次处于内联编辑模式的行将具有editable 属性。如果表格元素的 id 是“列表”,您可以使用

找到已编辑的行
$("#list tr[editable]")

集合中元素的id就是行的rowid。

如果您在网格中使用分页,则应小心并在更改页面之前将已编辑行的 id 保存在当前页面上。 onPaging 事件将在这里为您提供帮助。

在我看来,做你需要的最好和最安全的方法是使用editRowsaveRow 方法的aftersavefunc 参数(可能你只直接使用editRow)。在 aftersavefunc 函数中,您可以将修改后的行的 id 保存在数组/映射中。这将解决您的问题并安全工作。

【讨论】:

  • 我分析了你的方法,因为我也需要他的要求,但是你的方法给出了在某些时候选择了哪一行进行内联编辑的信息,而不是告诉行中的数据是否已经改变了与否。
  • @diosney:在我回答的第一句话中,我写道:“行上没有安全的脏标志”。如果您什么都没有,您可以使用$("#list tr[editable]") 来减少您需要发送到服务器的行数。您可以看到明确没有更改的行。就像我稍后写的那样,您可以使用aftersavefunc 来跟踪更改。它会安全工作。
  • 我正在尝试做几乎相同的事情,在未保存的更改时警告用户。上述方法不适用,当用户更改该值并稍后将其还原回来时,它仍然会认为它已更改。我正在使用内联编辑。 5年过去了,你现在有什么更新吗?请协助。谢谢
  • @RustinCohle:最好打开新问题,在其中准确描述您的工作以及遇到的问题。标准方式是editurl,并将数据直接保存在服务器上。它可以防止许多问题(例如并发控制等服务器端的处理错误)并简化代码。此外,不应将更多内容同时编辑为一行。还有更多替代方案,但了解 jqGrid 的确切用法以及您使用的 jqGrid 的版本和分支非常重要。
  • @Oleg 我被禁止提问。抱歉,我不是要保存。我提示用户你想离开吗?不保存。我想要跟踪更改的方式,保存不是问题,因为我没有保存。谢谢。我正在使用托尼的叉子。 4.6.0.
【解决方案2】:

最后,我设法带了一段代码来检测我们想要什么;)

希望那里的任何 jqgrid 大师(如 Oleg)有足够的时间来审查并改进此代码。

示例代码将用于检测网格中更改的数据,其中包含名为 “name” 的可编辑字段。如果要检查更多列中的更改数据,则必须添加与该列关联的变量 after_editbefore_edit

为了在onSelectRow函数中获取之前的单元格数据,我没有使用getCell方法,因为在文档中用红色表示:

当您编辑行或 细胞。这将返回单元格内容而不是 输入元素的实际值

不好意思,我可以检查文档是否正确 :(。 但是getCell 函数可以正常处理当前单元格数据。

这里是代码:

 // Declare variables used for inline edit functionality.
 var last_selected;
 var before_edit_value;
 var after_edit_value;
 $('#grid-id').jqGrid({
...

onSelectRow: function(row_id){
    if(row_id && row_id !== last_selected) {
        /*
         * Determine if the value was changed, if not there is no need to save to server.
         */
         if (typeof(last_selected) != 'undefined') {
            after_edit_value = $('#grid-id tr#' + last_selected + ' .name_column input').val();
         }

        if (before_edit_value != after_edit_value) {
            /*
             * Save row.
             */
            $('#grid-id').jqGrid(
                'saveRow', 
                last_selected, 
                function(response){
                    /* SuccessFunction: Do something with the server response */

                    return true;    
                }, 
                'http://url.to.server-side.script.com/server-side-script.php', 
                {
                    additional_data: 'example: additional string',
                });
            }
            else {
                /*
                 * Restore the row.
                 */
                $('#grid-id').jqGrid('restoreRow', last_selected);
            }

        before_edit_value   = $('#grid-id').jqGrid('getCell', row_id, 'name');
    }   

    last_selected       = row_id;

    /*
     * Edit row.
     */
    $('#grid-id').jqGrid(
        'editRow', 
        row_id, 
        true, 
        function() {/* OnEditFunction */}, 
        function(response) {
        /* SuccessFunction: Do something with the server response */

        return true;

    }, 
    'http://url.to.server-side.script.com/server-side-script.php', 
    {
        additional_data: 'example: additional string',
    }); 
   },
...
});

【讨论】:

  • 优秀的解决方案。不幸的是,这只适用于单列。如何检查任何列的所有可编辑列是否已更改或是否进行了某些编辑?
【解决方案3】:

在我的一个项目中,我执行了以下操作:在编辑行之前,我记得全局变量中的行数据,编辑完成后只需检查行数据是否已更改。像这样(双击激活编辑模式):

var beforeEditData;

function onGridDblClickRow(id) {
  if (isRowEditable(id)) {
    beforeEditData = grid.getRowData(id);
    grid.editRow(id, true, null, null, 'clientArray', null, onRowAfterEdit);
    ...
  }
}
function onRowAfterEdit(row) {
  var data = grid.getRowData(row);
  if (!isDataChanged(beforeEditData, data)) {        
    return; // No changes
  }
  ... // Save data here
}
function isDataChanged(before, after){
  ... // Allows tricky logic for dirty data, e.g. one may trim spaces etc.
}

【讨论】:

    【解决方案4】:

    使用 MVC4 和 JQuery 这就是我所做的

    在视图中

    <script type="text/javascript">
    
    var $grid = $("#Grid");
    var lastSelection;
    var datachanged = false;
    
    function gridInitialised() {
        var headers = $('th>div>:input');
        for (var h = 0; h < headers.length; headers[h++].onclick = (function () { if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; } }));
    }
    
    function editRow(id) {
        if (id && id !== lastSelection) {
            if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; }
            $grid.restoreRow(lastSelection);
            $grid.editRow(id, true);
            var inputs = $('#'+id+'>td>:input[class="editable"]');
            for (var i = 0; i < inputs.length; inputs[i++].onchange = (function () { datachanged = true; }));
            lastSelection = id;
        }
    }
    </script>
    
    @Html.Trirand().JQGrid(Model.Grid, "Grid")
    

    在模型中

                Grid.ClientSideEvents.RowSelect = "editRow";
                Grid.ClientSideEvents.GridInitialized = "gridInitialised";
    

    gridInitialised 代码用于处理对搜索过滤器的更改。

    戴夫

    【讨论】:

      【解决方案5】:

      正如 Oleg 5(哇)年前提到的 - 我使用了 saveRow 函数并将标志传递为 extraparam

      类似这样,假设您的“模型”或隐藏列 IsDirty 在我的情况下:

      onSelectRow: function(id) {
                      if (id && id !== lastgridsel) {
                          $("#myGrid").saveRow(lastgridsel, false, "clientArray", { IsDirty: "True" });
                          $("#myGrid").editRow(id, true, null, null, "clientArray");
                          lastgridsel = id;
                      }
                  },
      

      然后遍历保存单击(在我的情况下为外部按钮)上的行,类似于:

      $("#gridSaveBtn").on("click", function() {
                  var batch = new Array();
                  var dataIds = $("#myGrid").jqGrid("getDataIDs");
                  for (var i = 0; i < dataIds.length; i++) {
                      try {
                          $("#myGrid").jqGrid("saveRow", dataIds[i], false, "clientArray");
                          //get row data
                          var data = $("#myGrid").jqGrid("getRowData", dataIds[i]);
                          if (data["IsDirty"] === "True") {
                              batch.push(data);
                          }
                      } catch (ex) {
                          alert(ex.Message);
                          $("#myGrid").jqGrid("restoreRow", dataIds[i]);
                      }
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 2011-07-11
        • 2016-02-03
        • 1970-01-01
        • 2011-03-18
        • 2014-01-15
        相关资源
        最近更新 更多