在 jqGrid 中,您可以一次内联编辑多行然后进行一次提交吗?
Posted
技术标签:
【中文标题】在 jqGrid 中,您可以一次内联编辑多行然后进行一次提交吗?【英文标题】:In jqGrid, can you inline edit multiple rows at once and then do a single commit? 【发布时间】:2011-08-22 00:07:48 【问题描述】:我们正在使用 jqGrid 的jQuery('#grid').editRow()
功能,它允许您内联编辑一行中的字段。
jqGrid 是否支持一次内联编辑多行,我可以在其中对多行进行更改,然后一次全部提交?
我们试图避免必须对每一行进行逐一更改,并且每次都对服务器进行单独的“往返”以提交,因为我们希望批量编辑多个字段的多个字段记录并有一个“提交”。
【问题讨论】:
【参考方案1】:jqGrid 没有实现多行的内联编辑。您可以使用本地编辑并将所有更改手动发布到服务器,但您必须自己实现所有更改的提交。
我个人不会在我的项目中实施这种行为。原因是我认为网站应该始终支持并发(乐观并发最有意义)。如果有人尝试将更改提交给服务器,服务器会回答并发错误:其他人已经修改了数据。在需要刷新网格数据并重复行编辑的情况下。在使用乐观并发的情况下,我发现实现多行编辑的问题。错误消息的外观如何?如果更改了许多行,错误消息应该是什么样子?如果出现错误,用户应该怎么做?他/她是否应该重复数据的全部更改?从用户的角度来看,好处在哪里?
在我拥有的所有 jqGrid 实现中,几乎立即提交了一行的编辑。所以我认为没有必要在项目中一次做多行。在并发错误的情况下对用户的劣势更大,因为“往返”减少的优势更大。由于与服务器的连接非常好,因此在我的客户环境中发送数据不是问题。
【讨论】:
我喜欢你的回答。如果绝对需要一次更改一批行,我宁愿做一个 SQLite 本地存储和合并的数据同步。当然,写起来有点挑战,但很有趣:) 还有一些指针 ***.com/questions/3373103/…... 有趣的是,没有太多关于使用 jqGrid 本地数据的信息 @Alex Pakka:感谢您的帮助。我同意,这个问题可能只是 jqGrid 的更多数据库问题。解决方法可以取决于客户环境。关于***.com/questions/3373103/…这个问题,我不太同意你的看法。 jqGrid 的本地排序和过滤是纯 javascript 解决方案,从大约 1000 行开始就非常慢。 Web SQL 数据库/索引数据库或客户端的任何其他本机数据库实现可以有更好的性能。 哦,是的,当然,“本地”只是为了阻止 jqGrid 访问网络。所有的排序和搜索/查询都应该通过事件绑定在 jqGrid 之外完成。虽然不知道它会如何发挥作用,但可能需要一些 jqGrid 代码黑客......本身就是一个有趣的项目。【参考方案2】:在原始的 JQGrid 实现中不能对多行进行内联编辑。原始实现所做的是,您编辑并失去焦点的每一行都将被提交。
相反,创建一个像这样的自定义实现: 1.覆盖(扩展)现有的grid.inline.js并编写自己的编辑行并保存行。 2. 在编辑行功能中,配置添加单独收集的脏行(已编辑)。 3. 保存行功能中,可以只提交脏行给服务器。
并且为了防止同一数据的并发更新,您可以通过以下两种方式之一具有版本控制机制: 1.所有行都有一个版本字段(隐藏)。当一行变脏时,增加版本字段。 2. 提交行时,检查现有版本号和新版本号。如果存在不匹配,请告知用户/更新现有的。 (这个,你可以很容易地实现)
就是这样!希望这很有用! :-)
【讨论】:
对于乐观并发,通常使用rowversion
或timestamp
类型的附加列,这些列将自动更新(至少在MS SQL 中)或每个触发器。我看到的问题不是检测并发错误,而是为用户显示错误。让我们用户一次更新 10 行,并且您检测到第 2、7 和 10 行被另一个用户修改。应该采取什么行动?可以提交其他行中的更改。应重新加载第 2、7 和 10 行的包含,并且用户应重复对行的更改。你打算怎么做?
显示用户修改内容的差异以及修改后的行中存在哪些更改会很好。可能是由其他用户 other row field 进行了修改,因此可以做提交更改。可能存在真正的冲突。如何为用户准确显示(标记)有冲突的行?标记为红色?如何显示有冲突的字段?如果一个人只是放弃更改并显示错误消息,那么只有一个人可能会遇到难题。用户无法重现更改,或者可能认为某些工作已经完成,但事实并非如此。这样的问题我怕【参考方案3】:
我不太了解 jqGrid,但是我做了这个简单的测试(我可能遗漏了一些东西):
-
转到 jqGrid 演示页面http://www.trirand.com/blog/jqgrid/jqgrid.html
加载道路编辑/基本示例页面。
手动运行此代码:
jQuery("#rowed1").jqGrid('editRow', '11');
jQuery("#rowed1").jqGrid('editRow', '12');
jQuery("#rowed1").jqGrid('editRow', '13')
编辑三行
手动运行此代码:
jQuery("#rowed1").jqGrid('saveRow', '11');
jQuery("#rowed1").jqGrid('saveRow', '12');
jQuery("#rowed1").jqGrid('saveRow', '13');
当然 url 参数是必需的,我认为您可以使用 callback
选项来收集所有已编辑的行。
希望对你有帮助
【讨论】:
以上是关于在 jqGrid 中,您可以一次内联编辑多行然后进行一次提交吗?的主要内容,如果未能解决你的问题,请参考以下文章