jqgrid:如何发送和接收行数据保持编辑模式

时间:2011-07-08 15:38:42

标签: jqgrid

jqGrid有员工姓名和员工ID列。

如果employee name已更改,则应调用服务器验证方法以验证名称。应该从此方法返回的数据更新当前行列。

如果employee id已更改,则应调用服务器验证方法以验证ID。 应该从此方法返回的数据更新当前行列。

jqGrid最好保持编辑模式,以便用户可以继续更改,接受或拒绝更改。

如何在内联和表单编辑中实现此功能? 我正在考虑跟随可能性:

可能性1。

使用带有自定义验证器的editrules,如

            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },

问题:如何从所有列获取数据,进行同步或异步调用以及使用此调用结果更新列。

可能性2。

要求用户按Enter键保存行。 问题:如何查找已更改的列并将此列号传递给服务器。 如何从服务器响应中更新当前行数据。

可能性3。

使用Oleg中描述的模糊答案 jqgrid change cell value and stay in edit mode

问题:如果输入数据并立即按下输入,则不会触发模糊。在这种情况下如何应用模糊?

总结服务器sice计算/验证应如下所示:

如果列中已更改并且焦点移出或按下更改列中的要保存,则服务器端同步或如果不可能则应调用异步方法。更改列名和当前编辑的行值(如编辑方法)将作为参数传递给此方法。

此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。

更新

Oleg回答假定主键已被修改。这个因素并不重要。这是没有主键和其他更新的问题的新版本:

jqGrid有产品条形码和产品名称列。

如果product name已更改,则应调用服务器验证方法以验证名称。应该从此方法返回的数据更新当前行列。

如果product barcode已更改,则应调用服务器验证方法以验证产品条形码。 应该从此方法返回的数据更新当前行列。

jqGrid应保持编辑模式,以便用户可以继续更改,接受或拒绝更改。

如何在内联和表单编辑中实现此功能? 我正在考虑跟随可能性:

可能性1。

使用带有自定义验证器的editrules,如

            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },

问题:如果输入元素失去焦点,则不会触发custom_func。在为所有元素保存之前调用它。所以它无法使用。

可能性2。

要求用户按Enter键保存行。 问题:如何查找已更改的列并将此列号传递给服务器。 Save方法应该是已知列(名称或条形码更改顺序)并填充不同的列。这看起来不合理。

可能性3。

使用模糊:

colModel: [{"label":"ProductCode","name":"ProductCode","editoptions":{
"dataEvents":[
{"type":"focus","fn":function(e) { ischanged=false}},
{"type":"change","fn":function(e) {ischanged=true}},
{"type":"keydown","fn":function(e) {ischanged=true }},
{"type":"blur","fn":function(e) { if(ischanged) validate(e)} }
]},

为了实现验证,我发现Oleg的代码很棒 jqgrid change cell value and stay in edit mode

要求摘要:

如果列中已更改并且焦点移出或按下更改列中的要保存,则服务器端同步或如果不可能则应调用异步方法。更改列名和当前编辑的行值(如编辑方法)将作为参数传递给此方法。

此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值。

UPDATE2

这个问题不是关于并发性的。这是单用户和jqGrid问题。更新意味着单个用户更改产品名称或条形码,服务器shoudl提供附加数据(产品ID和/或名称/条形码)是对此的响应。

更新4

我试过下面的代码。  如果用户输入新代码并按Enter键而不移动到其他行,则不会出现模糊,也不会调用验证。

如果单元格是脏的还是其他想法如果按下Enter键结束编辑而不丢失更改的外键单元格的焦点,如何在jqGrid保存方法中进行dedect?

function validate(elem, column) {
ischanged = false;
var i, form, row;
var postData = { _column: column  };
var colModel = $("#grid").jqGrid('getGridParam', 'colModel');
var formEdit = $(elem).is('.FormElement');
// todo: use jQuery serialize()  ???
if (formEdit) {
    form = $(elem).closest('form.FormGrid');
    postData._rowid = $("#grid").jqGrid('getGridParam', 'selrow');
    for (i = 0; i < colModel.length; i++)
        eval('postData.' + colModel[i].name + '="' + $('#' + colModel[i].name + '.FormElement', form[0]).val() + '";');
}
else {
    row = $(elem).closest('tr.jqgrow');
    postData._rowid = row.attr('id');
    for (i = 1; i < colModel.length; i++)
        eval('postData.' + colModel[i].name + '="' + $('#' + postData._rowid + '_' + colModel[i].name).val() + '";');
}
$.ajax('Grid/Validate', {
    data: postData,
    async: false,
    type: 'POST',
    success: function (data, textStatus, jqXHR) {
        for (i = 0; i < data.length; i++) {
            if (formEdit)
                $('#' + data[i].name + '.FormElement', form[0]).val(data[i].value);
            else
                $('#' + postData._rowid + '_' + data[i].name).val(data[i].value);
        }
    }
});
}

colModel定义为:

{"name":"ProductBarCode",
"editoptions":    {"dataEvents":  
[{"type":"focus","fn":function(e) {ischanged=false}
},
{"type":"change","fn":function(e) {ischanged=true},
{"type":"keydown","fn":function(e) {if(realchangekey()) ischanged=true}
},{"type":"blur","fn":function(e) { if(ischanged) {  validate(       e.target,ProductBarCode')}}
}]},"editable":true}

1 个答案:

答案 0 :(得分:2)