jqGrid-内联编辑-检测脏的/更改的单元格

jqGrid-内联编辑-检测脏的/更改的单元格,jqgrid,inline-editing,Jqgrid,Inline Editing,有没有使用jqgrid的getChangedCells的例子 确定数据是否已更改的方法 我在可下载的演示中为 jqgrid,并且只能找到函数定义,而不能找到 getChangedCells的示例用法 我要做的是保存用户所做的编辑 如果用户单击另一行,则生成。但是,我只是 如果行不干净,则要提交保存 提前感谢,, --Nate行上没有安全脏标志。您可以使用这样一个事实,即在行编辑开始时(在开始时),方法将editable=“1”属性添加到网格行(元素)。稍后,单击方法并将属性值更改为editabl

有没有使用jqgrid的getChangedCells的例子 确定数据是否已更改的方法

我在可下载的演示中为 jqgrid,并且只能找到函数定义,而不能找到 getChangedCells的示例用法

我要做的是保存用户所做的编辑 如果用户单击另一行,则生成。但是,我只是 如果行不干净,则要提交保存

提前感谢,,
--Nate

行上没有安全脏标志。您可以使用这样一个事实,即在行编辑开始时(在开始时),方法将
editable=“1”
属性添加到网格行(
元素)。稍后,单击方法并将属性值更改为
editable=“0”
。因此,当前页面中至少有一次处于内联编辑模式的行将具有
editable
属性。如果table元素的id为“list”,则可以使用

$("#list tr[editable]")
集合元素的ID是行的RowID

如果在网格中使用分页,则应小心,并在更改页面之前保存当前页面上已编辑行的ID。这项活动将对你有所帮助


在我看来,执行所需操作的最佳和最安全的方法是使用or方法的
aftersavefunc
参数(可能仅直接使用)。在
aftersavefunc
函数中,可以将修改行的id保存在数组/映射中。这将解决您的问题并确保安全工作。

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

希望那里的任何jqgrid大师(比如)都有足够的时间来检查并改进代码

示例代码将用于检测网格中更改的数据,该网格具有一个名为“name”的可编辑字段。如果要在更多列中检查更改的数据,则必须在编辑后添加变量
,在编辑前添加与该列相关的变量

为了获取
onsetrow
函数中的上一个单元格数据,我没有使用
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',
    }); 
   },
...
});

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


数据前的var

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.
}

使用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")
GridInitialized代码用于处理对搜索筛选器的更改

Dave

正如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;
                }
            },
然后单击Save click(在我的例子中是external按钮)循环浏览行,内容如下:

$("#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]);
                }
            }
        });
$(“#gridSaveBtn”)。在(“单击”,函数(){
var batch=新数组();
var dataid=$(“#myGrid”).jqGrid(“getdataid”);
对于(var i=0;i
+1这是一个好问题。说真的,这是一个好问题!我希望能有更多的选票给你:(我分析了你的方法,因为我也需要他所要求的,但你的方法给出了在某一点上选择进行内联编辑的行的信息,而不是告诉行中的数据是否已更改。@diosney:在我回答的第一句话中,我写道:“行上没有安全脏标志”。如果您没有任何资料,您可以使用
$(“#list tr[editable]”)
减少需要发送到服务器的行数。您可以看到完全没有更改的行。正如我在后面写的,您可以使用
aftersavefunc
跟踪更改。它将安全工作。我尝试做几乎相同的事情,在未保存更改时警告用户。上述方法不适用当用户更改该值并稍后将其还原时,它仍会认为它已被更改。我正在使用内联编辑。自5年以来,您对此有任何更新吗?请协助。Thanks@RustinCohle:你最好打开一个新的问题,确切地描述你在做什么以及你遇到了什么问题。标准的方法是
editurl
和直接在服务器上保存数据。它可以防止许多问题(例如在服务器端处理错误,如并发控制)并简化代码。此外,不应同时编辑多行。有更多的选择,但了解jqGrid的确切用法以及您使用的jqGrid版本和分支非常重要。@Oleg我被禁止提问。抱歉,我不尝试保存。我会提示用户您要离开吗?不保存。我想知道跟踪更改的方法,保存不是问题,因为我没有保存。谢谢。我使用的是Tony's fork。4.6.0。非常好的解决方案。不幸的是,这只适用于单列。如何检查所有可编辑列的
$("#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]);
                }
            }
        });