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

jqgrid:如何在编辑模式下发送和接收行数据,jqgrid,Jqgrid,jqGrid有员工姓名和员工id列 如果员工姓名已更改,则应调用服务器验证方法来验证姓名。应根据此方法返回的数据更新当前行列 如果员工id已更改,则应调用服务器验证方法来验证id。 应根据此方法返回的数据更新当前行列 jqGrid最好保持编辑模式,以便用户可以继续更改、接受或拒绝更改 如何在内联和表单编辑中实现这一点? 我在考虑以下可能性: 可能性1 将editrules与自定义验证器一起使用,如 editrules = new {

jqGrid有员工姓名和员工id列

如果员工姓名已更改,则应调用服务器验证方法来验证姓名。应根据此方法返回的数据更新当前行列

如果员工id已更改,则应调用服务器验证方法来验证id。 应根据此方法返回的数据更新当前行列

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

如何在内联和表单编辑中实现这一点? 我在考虑以下可能性:

可能性1

将editrules与自定义验证器一起使用,如

            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },
            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },
问题:如何从所有列获取数据、进行同步或异步调用以及使用此调用结果更新列

可能性2

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

可能性3

如中的Oleg great answer中所述使用模糊

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

总之,服务器sice计算/验证应按如下方式进行:

若更改了列中的列,并在更改的列中按了“移出焦点”或“回车”以保存,则服务器端同步,若不可能,则应调用异步方法。更改的列名和编辑方法中的当前编辑行值作为参数传递给此方法

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

更新

Oleg answer假设主键已修改。这个因素并不重要。以下是问题的新版本,没有主键和其他更新:

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

如果
产品名称
已更改,则应调用服务器验证方法来验证名称。应根据此方法返回的数据更新当前行列

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

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

如何在内联和表单编辑中实现这一点? 我在考虑以下可能性:

可能性1

将editrules与自定义验证器一起使用,如

            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },
            editrules = new
            {
                custom = true,
                custom_func = function(value, colname) { ??? }
            },
问题:如果输入元素失去焦点,自定义函数不会激发。它在保存所有元素之前被调用。所以它不能被使用

可能性2

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

可能性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中的代码在

所需经费概要:

若更改了列中的列,并在更改的列中按了“移出焦点”或“回车”以保存,则服务器端同步,若不可能,则应调用异步方法。更改的列名和编辑方法中的当前编辑行值作为参数传递给此方法

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

更新2

这个问题与并发无关。这是单用户和jqGrid的问题。更新意味着单个用户更改产品名称或条形码,服务器应提供附加数据(产品id和/或名称/条形码)作为响应

更新4

我尝试了下面的代码。 若用户输入新代码并按Enter键而不移动到其他行,则不会发生模糊,也不会调用验证

如果单元格脏了,如何在jqGrid保存方法中删除?或者,如果按enter键结束编辑,如何强制运行此代码,而不丢失更改的外键单元格的焦点

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);
        }
    }
});
}

这是一个从问题,这是更容易避免和消除。我必须提醒您我的建议(在对的评论中)使用不可变的主键,因此,主键永远不会更改。可以销毁数据库表的记录,但新记录的id不应为已删除记录

在任何并发控制实现中,服务器首先能够检测到并发问题是很重要的。您的web应用程序的两个(或多个)用户可能会读取相同的信息,例如有关员工的信息。例如,这些信息可以在jqGrids中显示。如果允许更改员工id,则第一个问题是检测并发错误。让我们看看,一个用户将更改员工id,另一个用户将尝试根据以前加载的信息修改同一员工。用户提交MIDID后,服务器应用程序将只接收“编辑”请求,但将在数据库中找不到相应的记录。服务器必须发送错误响应,但不提供任何详细信息。因此的
errorfunc
或的事件处理程序
errorTextFormat
应触发“reloadGrid”,重新加载整个网格

如果您允许编辑主键,那么我可以想象前面描述的更危险的情况。另一个用户不仅可以将当前编辑行的id更改为另一个值,还可以更改另一条记录的id,使其新id与当前编辑id相同。在这种情况下,保存行的请求将覆盖另一条记录ALTER TABLE dbo.Employees ADD NewId int IDENTITY NOT NULL ALTER TABLE dbo.Employees ADD RowUpdateTimeStamp rowversion NOT NULL ALTER TABLE dbo.Employees ADD CONSTRAINT UC_Employees_NewId UNIQUE NONCLUSTERED (NewId) GO