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