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

2024-02-26

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

If employee name已更改,应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。

If employee id已更改,应调用服务器验证方法来验证 id。 当前行列应根据此方法返回的数据进行更新。

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

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

可能性1。

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

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

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

可能性2。

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

可能性3。

使用模糊,如 Oleg 中所述,很好的答案jqgrid 更改单元格值并保持编辑模式 https://stackoverflow.com/questions/5247138/jqgrid-change-cell-value-and-stay-in-edit-mode

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

总之,服务器端计算/验证应按如下方式完成:

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

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

Update

奥列格的回答假设主键已修改。这个因素并不重要。这是问题的新版本,没有主键和其他更新:

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

If product name已更改,应调用服务器验证方法来验证名称。当前行列应根据此方法返回的数据进行更新。

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

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

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

可能性1。

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

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

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

可能性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 中找到了很好的答案jqgrid 更改单元格值并保持编辑模式 https://stackoverflow.com/questions/5247138/jqgrid-change-cell-value-and-stay-in-edit-mode

要求摘要:

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

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

Update2

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

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

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}

这是避免比消除更容易的问题之一。我必须提醒你我的建议(在评论中答案 https://stackoverflow.com/questions/6170325/jqgrid-how-to-update-row-id-if-primary-key-columns-was-edited/6170380#6170380)使用不可变的主键,因此永远不会改变。数据库表的记录可以被销毁,但新记录不应具有已删除记录的id。

在任何并发控制实现中,服务器优先是很重要的able来检测并发问题。您的 Web 应用程序的两个(或更多)用户可能会读取相同的信息,例如有关员工的信息。例如,该信息可以显示在 jqGrids 中。如果您允许更改员工 ID,那么第一个问题将是检测并发错误。让我们一个用户将更改员工 ID,另一个用户将尝试根据先前加载的信息。用户提交修改后,服务器应用程序只会收到“编辑”请求,但不会在数据库中找到对应的记录。服务器必须发送没有任何详细信息的错误响应。所以errorfunc of the editRow http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#editrow或事件处理程序errorTextFormat of the 编辑网格行 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#editgridrow应该触发“reloadGrid”重新加载整个网格包含。

如果允许编辑主键,那么我可以想象前面描述的更危险的情况。另一用户不仅可以将当前编辑行的 id 更改为另一个值,还可以更改另一条记录的 id,这样其新 id 将与当前编辑 id 相同。在这种情况下,保存行的请求将覆盖另一条记录.

为了防止此类问题并简化乐观并发控制 http://en.wikipedia.org/wiki/Optimistic_concurrency_control可以添加一个附加列,它表示数据库的每个表中可以修改的任何形式的时间戳。我个人使用 Microsoft SQL Server 并添加我用来添加类型的不可空列行版本 http://msdn.microsoft.com/en-us/library/ms182776.aspx(与类型相同时间戳 http://msdn.microsoft.com/en-us/library/ms182776%28v=sql.90%29.aspx在以前版本的 SQL Server 中)。的价值行版本 http://msdn.microsoft.com/en-us/library/ms182776.aspx将与数据一起发送到jqGrid。将发送到服务器的修改请求将包含行版本 http://msdn.microsoft.com/en-us/library/ms182776.aspx。如果有数据会保存在数据库中相应的值rowversion列将是自动修改通过 SQL 数据库。通过以下方式,服务器可以很容易地检测并发错误:

CREATE PROCEDURE dbo.spEmployeesUpdate
    -- @originalRowUpdateTimeStamp used for optimistic concurrency mechanism
    -- it is the value which correspond the data used by the user as the source
    @Id int,
    @EmployeeName varchar(100),
    @originalRowUpdateTimeStamp rowversion,
    @NewRowUpdateTimeStamp rowversion OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    -- ExecuteNonQuery() returns -1, but it is not an error
    -- one should test @NewRowUpdateTimeStamp for DBNull
    SET NOCOUNT ON;

    UPDATE dbo.Employees
    SET Name = @EmployeeName
    WHERE Id=@Id AND RowUpdateTimeStamp=@originalRowUpdateTimeStamp;

    -- get the new value of the RowUpdateTimeStamp (rowversion)
    -- if the previous update took place
    SET @NewRowUpdateTimeStamp = (SELECT RowUpdateTimeStamp
                                  FROM dbo.Employees
                                  WHERE @@ROWCOUNT > 0 AND Id=@Id)
END

您可以在服务器应用程序的代码中验证输出参数@NewRowUpdateTimeStamp将由存储过程设置dbo.spEmployeesUpdate。如果未设置,服务器应用程序可能会抛出DBConcurrencyException例外。

因此,我认为您应该修改数据库和服务器应用程序代码以实现乐观并发控制。之后,如果出现并发错误,服务器代码应返回带有 HTTP 错误代码的响应。这errorfunc of the editRow http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#editrow或事件处理程序errorTextFormat of the 编辑网格行 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#editgridrow应重新加载当前修改行的新值。您可以使用更复杂的方式 https://stackoverflow.com/questions/5121350/jqgrid-access-cell-data-while-it-is-being-edited/5129908#5129908或者只是重新加载网格并继续修改当前行。的情况下不变rowid 您可以轻松找到新加载的行并在网格重新加载后开始编辑。

在现有数据库中您可以使用

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

然后你可以使用NewId而不是 jqGrid 或您需要的任何其他地方的 id。这NewId可以与您当前的主键共存,直到您更新应用程序的其他部分以更有效地使用NewId.

UPDATED:我不认为人们真的需要对并发错误实施任何复杂的错误纠正。在我的客户的项目中,需要编辑的数据不能包含任何长文本。因此,简单的消息,描述当前修改无法保存的原因就足够了。用户可以手动重新加载整个网格并验证他编辑的行的当前包含。人们不应忘记,任何复杂的程序都可能给项目带来额外的错误,实施起来很复杂,它会延长开发预算,而且大多数额外的投资永远无法得到回报。

例如,如果您确实需要实现编辑行的自动刷新,我永远不会在“模糊”事件中实现单元格验证。相反,人们可以验证内部errorfunc of the editRow http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#editrow或内部errorTextFormat的事件处理程序编辑网格行 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#editgridrow服务器返回并发错误。万一发生并发错误,可以将当前编辑行的 id 保存在一个变量中,该变量可以在loadComplete事件句柄。然后,在显示错误消息后,可以重新加载网格$('#list').trigger('reloadGrid',[{current:true}]) (see here https://stackoverflow.com/questions/3807623/jqgrid-paging-question/3808014#3808014)。代替loadComplete事件句柄可以验证中止的编辑行的变量是否已设置。在这种情况下可以打电话editRow http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing#editrow or 编辑网格行 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:form_editing#editgridrow并继续编辑字符串。我认为当当前行更改时,页面的其他行也可能会更改。因此,重新加载当前页面比仅重新加载当前单元格或网格的一行数据更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jqgrid:如何发送和接收行数据保持编辑模式 的相关文章

  • 保存/提交时重新加载 jqGrid

    我有以下代码可以在双击时进入内联编辑 ondblClickRow function row id if row id null Products jqGrid restoreRow last selected row Products jq
  • 持久保存js用户控制状态

    我的 RIA 应用程序有很多 js UI 控件 几乎所有都是 jQuery UI 部分 如 datepicker dialog jqgrid 因此 然后用户在一个页面上使用一些控件 然后转到另一个页面 然后单击返回所有页面组件都具有初始状态
  • 在自定义格式化程序中访问 rowObejct

    在 jqgrid wikki 中 我读到 虽然使用 xml 数据类型 rowobject 将不是一个数组 在 json 中 我使用 rowobject 1 2 等获取了列值 但是如何使用 xml 数据类型来实现这一点 请提供使用 xml 数
  • JQgrid 从列中保存和恢复对象

    可以将复杂的对象保存到列中并在之后恢复它 这是一个例子 杰森 datamain mydata address data1 15 data2 0 0 data3 1000 Jqgrid jQuery rowed5 jqGrid datatyp
  • jqGrid:用双击代替单击进入单元格编辑模式

    Using jqGrid 中的单元格编辑模式 http www trirand com jqgridwiki doku php id wiki cell editing 默认行为是只要单击某个单元格或选择该单元格并按下 Enter 键 就会
  • 在 jqgrid 中编辑树形网格展开列的任何字段时..获取该单元格的 html 内容,而不是实际值。有什么解决办法吗?

    在 jqgrid for treegrid 中 当我单击 ExpandColumn name 列的单元格中显示的值进行编辑时 我将获取单元格内内容的 html 我得到的 html 内容是 div class tree wrap tree w
  • JqG​​rid 搜索字段的多个文本框

    我想知道 JqGrid 高级搜索是否可以为我想要搜索的某些字段显示多个文本框 例如 如果我有一个 电话号码 字段 我希望能够可视化 2 个框 一个用于区号 另一个用于电话号码的其余部分 然后按 查找 后 我希望能够获取两个值并将它们合并或执
  • jQuery - jQGrid - 展开、折叠网格行上的子网格单击

    Here https stackoverflow com questions 3345401有一个关于当我们单击一行时如何扩展子网格的答案 onSelectRow function rowId jqgrid id expandSubGrid
  • jqgrid 掩码十进制数字单元格

    我的 jgrid 中有一个 float 类型的列 我想在用户输入单元格时屏蔽列单元格 例如 掩码应为 99999 99 当 9 0 9 之间的任何数字时 我希望该点左侧最多有 5 位数字 该点右侧最多有 2 位数字 并且可以输入少于最大值的
  • 在jqGrid的Edit Url中传递参数进行表单编辑

    我在用jgGrid表单编辑 我在其中更新编辑的值 当我点击提交时editurl被叫 在这种情况下 在我的场景中 我必须将两个参数传递给控制器 jqGrid代码 var colname var colHeader var gridData v
  • jqGrid 复选框列

    我有一个相当复杂的网格 有两列格式化为复选框 这些列定义如下 name Alert A index Alert A width 22 align center sortable false formatter CheckBoxFormatt
  • 如何在导航栏 jqgrid 上添加第二个自定义删除按钮?

    我已经在使用默认删除按钮进行自定义操作 在服务器端它在删除之前复制行 我想知道如何创建第二个删除按钮 将删除操作发送到不同的 url 以便在数据库的表上删除 我不想更改当前服务器端代码上的任何内容 只想为从此按钮发送的删除操作创建新代码 我
  • 我应该使用 jquery 中的哪个或哪个插件来使用 xml 文件内容填充 html 表?

    我需要显示来自服务器的 xml 文件的数据 文件路径类似files client xml 到 html 表或 datagrid 中 我应该使用哪个插件 或者更确切地说 我应该使用什么插件 以便它具有可变分页 过滤器和表 CSS 自定义 任何
  • 当 contentType=application/json 时 Jquery JQGrid 中断?

    我必须使用 ajaxSetup 将 contentType 全局更改为 application json ajaxSetup contentType application json charset utf 8 请参阅此问题了解为什么我必须
  • jqGrid:使用本地数据类型加载嵌套子网格时出现问题

    我正在尝试使用 jqGrid 和本地数据让嵌套子网格工作 我已经搜索了很多 但未能找到解决方案 这是我的代码的简化示例 var mainGridData main grid data id m1 col1 11 col2 12 id m2
  • 重新加载不适用于 jqgrid

    以下代码不会重新加载网格 myjqgrid trigger reloadGrid 如果我理解正确的话 即使数据没有更改 它也应该进行 ajax 调用并重新加载网格 HTML table table div div JSON colModel
  • 为什么使用 gridview:true 以及它的含义是什么?

    我正在 JqGrid 上工作 我想知道如果我们指定的话意味着什么gridview true 以及什么情况下我们需要提供 我最近正在开发一个这样的 jqGrid 和我的afterInsertRow没有被调用 一旦我删除了gridview tr
  • jqgrid editoptions:必需的不起作用

    好吧 不确定我在这里做错了什么 list jqGrid url URL datatype json mtype GET colModel label Index index Index key true hidden true label
  • jqgrid。改变主题

    如何在不更改样式表的情况下更改 jqgrid 的外观 基本上我使用 jqueryui 来设计我的网站 但我想为网格使用不同的背景图像 这可能吗 您是否想要将多个 jQueryUI 主题应用到同一页面 并让 jqgrid 使用其中一个主题 同
  • 有没有办法动态更改 jqGrid 的单元格值?

    这个问题可能已经被问过很多次了 但我想知道是否可以动态更改 jqgrid 的单元格值 我基本上有一个网格 它通过 JSON 字符串加载数据 在特定列的某些行上 该值可能为 null 因此 预先知道哪个行 ID 是一个问题 然后能够将 nul

随机推荐

  • Angular 2:将数据传递给路由?

    我正在开发这个 angular2 项目 我正在使用ROUTER DIRECTIVES从一个组件导航到另一组件 有 2 个组件 IE PagesComponent DesignerComponent 我想从页面组件导航到设计组件 到目前为止
  • 在用户界面和控制台应用程序中使用 Task.Yield() 之间的区别

    我试图异步显示一个进度表单 表明应用程序正在运行 而实际应用程序正在运行 如下这个问题 https stackoverflow com questions 33406939 async showdialog 我有以下内容 主要形式 publ
  • java中提交内存的确切状态

    我很好奇从 MemoryUsage 类查询值时 提交 内存的确切含义是什么 该类将其解释为 已提交代表保证可供 Java 虚拟机使用的内存量 以字节为单位 这是否意味着该内存正在被 jvm 进程使用 并且在被 java 进程释放之前不可用于
  • autodoc 扩展模拟类的类

    我正在尝试在扩展外部类的类上运行 autodoc 我使用了模拟以便接受导入 为此 我使用了本博客中描述的内容http blog rtwilson com how to make your sphinx documentation compi
  • 大型 DAG 上的拓扑排序示例

    我正在寻找现实世界的应用程序拓扑排序执行于大图 sizes 我想象您可以找到此类实例的一些领域是生物信息学 依赖性解析 数据库 硬件设计 数据仓库 但我希望你们中的一些人可能遇到或听说过任何需要的特定算法 项目 应用程序 数据集顶排序 即使
  • SELECT 滚动的 Javascript 控制

    首先 我不是 Javascript 专家 我想向我正在使用的选择框添加一项功能 当添加新项目时 该功能会自动滚动到末尾 但前提是用户尚未向上滚动 基本上 当用户查看较旧的条目时 我不希望新到达的条目将位置固定到选择列表的末尾 但是 如果用户
  • 将网络拆分为多个前缀的子网

    我正在使用netaddr模块并试图弄清楚如何 是否可以将网络拆分为不同前缀的子网 例如 将 16 拆分为 X 23 和 Y 24 据我所知 我们可以使用subnet函数将网络分割为 X 个给定前缀 但只需要 1 个前缀 上面的代码将从 16
  • 垂直对齐内联柔性元素

    我试图在同一个 div 中垂直对齐 3 个不同的 inline flex 元素 但最后一个不符合预期 container height 100px width 100 background color blue container left
  • Android MPchart Piechart Legend set自定义错误

    我正在使用 MPchart 饼图 当我设置自定义图例数组时 它不接受该数组 我的代码 Legend l chart getLegend l setCustom ColorTemplate VORDIPLOM COLORS new Strin
  • Django Rest Framework 多个嵌套可写序列化器

    我正在尝试使用 django Rest 框架实现多个嵌套的可写序列化器 我已阅读可用的文档http www django rest framework org api guide serializers writable nested re
  • 如何在 lme4 中获取收敛错误消息或最大梯度

    使用 lme4 进行随机效应模型后如何获得最大梯度值 默认情况下 如果大于0 002就会显示 但我想制作一个如下所示的原始函数 它需要一个最大梯度的返回值 无论该值是否大于0 002 做原始模型 MM lt lmer Y 1 X 1 clu
  • 如何在matplotlib中绘制单个点

    我想在图表上绘制一个点 但似乎它们都需要绘制为列表或方程 我需要像这样绘制ax plot x y 我的位置会出现一个点x y我的图表上的坐标 import matplotlib pyplot as plt from mpl toolkits
  • NoSQL 用例场景或何时使用 NoSQL [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 尽管有这么多的炒作 但似乎很难找到关于何时使用它的可靠信息 所以我提出以下问题 如果这些问题真的很愚蠢 我很抱歉 我应该对用户数据使用 NoSQ
  • 如何运行后台进程来响应 VSTO Office 加载项中的选择更改事件?

    我有一个 VSTO 应用程序级加载项 带有我自己的自定义任务窗格 我试图拦截 SelectionChange 事件 并在自定义任务窗格中显示与选择相关的信息 我确实知道如何同步执行此操作 但是 获取要显示的信息的过程很慢 并且我不想在获取信
  • 四舍五入浮点数:精确打印小数点后两位数字,四舍五入到最接近的小数位

    我们如何在 C C 中对浮点数进行四舍五入 以精确打印小数点后四舍五入到最接近的小数位的两位数字 举例来说 当我使用时 printf 2f 12 555 cout lt
  • 如何在 Clojure 中以字符串形式获取函数名称?

    在 Clojure 中如何以字符串形式获取函数名称 到目前为止 我所拥有的看起来并不接近惯用 defn fn name f first re find lt str f defn foo fn name foo returns foo ED
  • 如何在DataGridTextColumn的工具提示中显示IDataErrorInfo的错误?

    对于文本框 当我将以下 xml 放入 App xml 时效果很好
  • NameError:未定义全局名称

    我在 Mac OS X 上使用 Python 2 6 1 我有两个简单的 Python 文件 如下 但是当我运行时 python update url py 我在终端上得到 Traceback most recent call last F
  • 将一个派生类转换为另一个派生类而不更改基类

    我有几个孩子班级都有同一个家长 每个子类都可以使用父对象中包含的一些数据来构造 我想使用基础对象中包含的信息将一个孩子转换为另一个孩子 不修改基础对象 目前它的实现如下例所示 include
  • jqgrid:如何发送和接收行数据保持编辑模式

    jqGrid 有员工姓名和员工 ID 列 If employee name已更改 应调用服务器验证方法来验证名称 当前行列应根据此方法返回的数据进行更新 If employee id已更改 应调用服务器验证方法来验证 id 当前行列应根据此