jqGrid:表单编辑保存到行中,但来回分页时所有更改都丢失

jqGrid:表单编辑保存到行中,但来回分页时所有更改都丢失,jqgrid,form-editing,Jqgrid,Form Editing,我正在对本地数据使用表单编辑。我可以编辑表单中的值并将值设置回行(使用setRowData)但当我前后翻页时,更改会丢失。 如何在网格中保存对行和基础源的更改?稍后,我必须迭代行,验证所有错误是否已更正(使用编辑表单),并将其发布到服务器 代码: 谢谢你的帮助 谢谢我想您出现问题的原因是在localReader中使用了输入数据的数组格式(repeatitems:true)。我假设您需要从postdata构建数组,并将其用作setRowData的参数,而不是postdata 如果这个建议对您没有帮

我正在对本地数据使用表单编辑。我可以编辑表单中的值并将值设置回行(使用setRowData)但当我前后翻页时,更改会丢失。

如何在网格中保存对行和基础源的更改?稍后,我必须迭代行,验证所有错误是否已更正(使用编辑表单),并将其发布到服务器

代码:

谢谢你的帮助


谢谢

我想您出现问题的原因是在
localReader
中使用了输入数据的数组格式(
repeatitems:true
)。我假设您需要从
postdata
构建数组,并将其用作
setRowData
的参数,而不是
postdata

如果这个建议对您没有帮助,您应该发布更完整的网格代码和测试数据。像
colModel:getColModel(),
这样的代码实际上没有帮助。换句话说,你应该发布足够的信息来重现问题。最好是一个工作中的演示。如果您准备这样的演示,请使用
jquery.jqGrid.src.js
而不是
jquery.jqGrid.min.js

更新:代码中的问题是,如果输入
数据
,则使用数组是项(您在
localReader
中使用
repeatitems:true
)。在这种情况下,
setRowData
的当前实现不支持(工作不正确)。例如,如果您最初有这样的数据

然后开始编辑第三行,您将看到如下内容

使用后,使用类似的
$('#mygrid').jqGrid('setRowData',postdata.row,postdata)
onclickSubmit
的内部。因此,内部数据将被错误地修改

要解决此问题,我建议通过包含以下代码覆盖当前的
setRowData
实现

$.jgrid.extend({
setRowData:函数(rowid、数据、cssp){
var nm,success=true,title;
这个。每个(函数(){
如果(!this.grid){return false;}
var t=this,vl,ind,cp=typeof cssp,lcdata=t.p.datatype==“local”和&t.p.localReader.repeatitems===true?[]:{},iLocal=0;
ind=$(this.jqGrid('getGridRowById',rowid);
如果(!ind){return false;}
如果(数据){
试一试{
$(this.p.colModel)。每个(函数(i){
nm=这个名称;
var dval=$.jgrid.getAccessor(数据,nm);
如果(dval!==未定义){
vl=this.formatter&&typeof this.formatter=='string'&&this.formatter=='date'?$.unformat.date.call(t,dval,this):dval;
if(t.p.datatype==“local”&&t.p.localReader.repeatitems===true){
lcdata[iLocal]=vl;
}否则{
lcdata[nm]=vl;
}
vl=t.formatter(rowid,dval,i,data,'edit');
title=this.title?{“title”:$.jgrid.stripHtml(vl)}:{};
if(t.p.treeGrid==true&&nm==t.p.ExpandColumn){
$($td[role='gridcell']:eq(“+i+”)>span:first,ind).html(vl.attr(title);
}否则{
$(“td[role='gridcell']:eq(“+i+”),ind.html(vl.attr)(title);
}
}
如果(nm!=“cb”&&nm!=“子网格”&&nm!=“rn”){
iLocal++;
}
});
如果(t.p.datatype=='local'){
变量id=$.jgrid.stripPref(t.p.idPrefix,rowid),
pos=t.p.\U索引[id],键;
如果(t.p.treeGrid){
用于(输入t.p.treeReader){
if(t.p.treeReader.hasOwnProperty(键)){
删除lcdata[t.p.treeReader[key]];
}
}
}
如果(位置!==未定义){
t、 p.data[pos]=$.extend(true,t.p.data[pos],lcdata);
}
lcdata=null;
}
}捕获(e){
成功=错误;
}
}
如果(成功){
if(cp=='string'){$(ind).addClass(cssp);}否则if(cssp!==null&&cp=='object'){$(ind).css(cssp);}
$(t).triggerHandler(“jqGridAfterGridComplete”);
}
});
回归成功;
}
});

稍后我会将我的建议发布到trirand。因此,我们可以希望这个问题能在下一版本的jqGrid中得到解决。

Oleg说,“你问题中的代码没有使用我在这里引用的代码。演示中没有你描述的问题。”@Oleg是的,我引用了你演示中的代码,但实际上借用了部分代码,而不是整个onclickSubmitLocal函数。我不知道我错过了什么@Oleg,我已经将演示与我的代码(上面已更新)进行了比较,但无法使其正常工作。有些东西不见了,不知道是什么!如果我将repeatitems设置为false,则网格行为空。尝试克隆传递给setRowData的对象,但不起作用;更改丢失。已经创建了一个示例(几乎接近我的真实代码):。您应该能够在机器上本地运行它。@Vivekragunahan:我更新了我的答案。
setRowData
方法的新(固定)实现应该可以解决您的问题。从外观上看,将输入数据设置为JSON而不是数组似乎更安全。但我不会那么做。因为
var gridId = 'mygrid';
var pagerId = 'mygridpager';

var grid = $('#mygrid');
var pager = $('#mygridpager');

grid.jqGrid({
    caption: caption,
    colModel: getColModel(),
    recreateForm: true,

    hidegrid: true,
    sortorder: 'desc',
    viewrecords: true,
    multiselect: true,
    rownumbers: true,

    autowidth: true,
    height: '100%',
    scrollOffset: 0,

    datatype: 'local',
    data: dataAsArray,
    localReader: {
        repeatitems: true,
        cell: '',
        id: 2
    },

    pager: '#' + pagerId,
    pgbuttons: true,
    rowNum: 5,
    rowList: [2, 5, 7, 10, 250, 500]
});

grid.jqGrid('navGrid',
    '#' + pagerId,
    {
        add: false,
        del: false,
        search: false,

        edit: true,
        edittext: 'Fix Error',
        editicon: 'ui-icon-tag',
        editurl: 'clientArray',

        refreshtext: 'Refresh',
        recreateForm: true
    },
    {
        // edit options
        editCaption: 'Fix Error',
        editurl: 'clientArray',
        recreateForm: true,
        beforeShowForm: function(form) {
            /* Custom style for elements. make it disabled etc */
        },
        onclickSubmit: function(options, postdata) {
                    var idName= $(this).jqGrid('getGridParam').prmNames.id;

                    // [UPDATED]
                    if (postdata[idName] === undefined) {
                        var idInPostdata = this.id + "_id";
                        postdata[idName] = postdata[idInPostdata];
                        postdata['row'] = postdata[idInPostdata];
                    }

            $('#mygrid').jqGrid('setRowData', postdata.row, postdata);

            if (options.closeAfterEdit) {
                $.jgrid.hideModal('#editmod' + gridId, {
                    gb: '#gbox_' + gridId,
                    jqm: options.jqModal,
                    onClose: options.onClose
                });
            }

            options.processing = true;

            return {};
        }
    },
    {}, // add options
    {}, // del options
    {} //search options
).trigger('reloadGrid');