2

有没有直接的方法jqGrid通过内联编辑在客户端对数据进行排序?当行可编辑时,即使单击行标题,它也不会对数据进行排序。

4

3 回答 3

3

如果某行正在编辑,则无法对网格进行排序。我认为您提出问题的原因是对内联编辑的工作原理和排序的工作原理存在误解。

开始编辑时,编辑行中的原始数据将保存在内部参数savedRow数组中。用户可以随时将当前修改恢复到原始状态或将当前值保存在网格中。如果keys: true启用了内联编辑选项,则用户可以使用EscEnter键来恢复/保存当前行的更改。允许多行同时处于编辑模式,用户可以保存一些行并恢复一些其他行。

网格的排序意味着从内部参数应用当前过滤器重建完整的网格内容。jqGrid支持多页。网格排序始终意味着对网格的所有数据进行可选过滤的排序。排序后是否应根据参数值仅显示当前页面。postDatapage

要对处于编辑模式的网格进行排序,需要确定当前正在编辑的行应该做什么。在常见情况下,丢弃当前更改或保存都不是好的解决方案。即使有人会先尝试保存当前的编辑数据(旧状态和当前状态),然后对数据进行排序,然后再开始编辑一次,这在通常情况下无法正常工作。实施这种情况可能有很多问题

  1. 当前编辑行可能在另一个页面上,现在不可见
  2. 现在可以更改数据。所以用旧数据填充savedRow数组可能是错误的,当前编辑数据也可能是错误的。
  3. 当前编辑行可以从另一个用户中删除。所以它不能存在于新的网格内容中。
  4. 如果我们决定在排序之前保存数据,是否可能在保存过程中出现一些验证错误或并发错误。因此,需要先要求用户解决所有冲突,然后才能进行保存。
    ...

因此,对处于编辑模式的网格进行排序并不容易。实施方式可能取决于项目要求。由于上述问题(以及许多其他我没有提到的问题),jqGrid 只是测试内部savedRow数组(用于在编辑开始之前保存行的旧状态)是否为空。如果savedRow数组不为空,则现在正在编辑某些行或单元格(在出售编辑模式的情况下)。在这种情况下,对相应列标题的任何单击都将被忽略并且不进行排序。

于 2013-04-03T18:24:33.617 回答
1

我遇到了同样的问题——如果任何行处于编辑模式,则无法排序。就我而言,用户编辑的状态是什么并不重要。我的网格是客户端,页面上有一个保存按钮,用户单击以提交更改。

我做了一些挖掘,找到了一个适合我的解决方案。我希望它可以帮助其他人。基本上我所做的是重新排序列标题上的点击事件,以便我的是第一个。然后在我的点击事件中我调用 saveRows。

这是我从另一个线程这里得到的关于重新排序事件的一段代码:

        $.fn.bindUp = function(name, fn) {
        // bind as you normally would
        // don't want to miss out on any jQuery magic
        this.on(name, fn);

        // Thanks to a comment by @Martin, adding support for
        // namespaced events too.
        this.each(function() {
            var handlers = $._data(this, 'events')[name.split('.')[0]];
            // take out the handler we just inserted from the end
            var handler = handlers.pop();
            // move it at the beginning
            handlers.splice(0, 0, handler);
        });
    };

然后在我的代码中添加一个处理程序来保存行:

        $("th.ui-th-column", $("#pacPaymenReviewGridNEW")[0].grid.hDiv).bindUp('click', function(e) {
        var $th = $(e.currentTarget).closest("th");
        if ($th.length > 0) {
            pacTransferFundMaint.saveRowsById('#pacPaymenReviewGridNEW');
        }
    });     
于 2013-12-17T18:55:15.850 回答
0

经过研究,我发现了以下算法:

  1. 捕捉标题点击事件。例如 ('th').click(function(){})
  2. saveRow保存该事件发生时处于编辑模式的行数据
  3. 识别被点击的标题。
  4. 使用该标题按升序或降序对网格数据进行排序。像
    $('#dataGrid').jqGrid('setGridParam', ({ data: list, sortname: columnHeader, sortorder: 'asc',rowNum: list.length })).trigger('reloadGrid');

  5. 使选定的行再次可编辑。editRow可用于此。

注意:步骤 2 到 5 应该在步骤 1 的事件中执行(标题点击事件)

于 2013-04-06T06:48:00.257 回答