2012-02-14 100 views
6

我对网格的使用涉及在内联编辑模式下有几行时进行排序。在jqGrid中编辑内联行时排序问题

的问题是:

  1. 有什么办法来执行排序,而内联编辑一行或多行?

  2. 如果没有,有没有当我点击列标题,将跳的事件,而内联编辑一行或多行?(一个事件,我也许可以去掉编辑,排序内容之前)

感谢,Catalin

回答

7

一个有趣的问题!从我+1。

排序编辑行或单元格的问题在于访问编辑单元格的内容。 jqGrid的当前代码不会执行此操作,因此列标题的click事件处理函数内部会测试网格中是否存在任何编辑行。如果存在一些编辑行/行,则排序将被停止而不是以调用onSortCol回调。

因此,只有第二种方法可以在排序之前保存或恢复编辑单元格。为了实现这个,有一个小问题。如果在列标题上绑定其他click事件,则将在之前调用jqGrid的上一个绑定标准处理程序。因此,在之前,无法保存或放弃更改的编辑,因此会处理点击事件。可以通过两种方式解决问题:可以从新的事件处理函数调用sortData函数,也可以将绑定的顺序更改为click事件。下面的代码演示了第二种方法:

$.each($grid[0].grid.headers, function() { 
    var $th = $(this.el), i, l, clickHandler, clickHandlers = [], 
     currentHandlers = $th.data('events'), 
     clickBinding = currentHandlers.click; 

    if ($.isArray(clickBinding)) { 
     for (i = 0, l = clickBinding.length; i < l; i++) { 
      clickHandler = clickBinding[i].handler; 
      clickHandlers.push(clickHandler); 
      $th.unbind('click', clickHandler); 
     } 
    } 
    $th.click(function() { 
     var p = $grid[0].p, savedRow = p.savedRow, j, len = savedRow.length; 
     if (len > 0) { 
      // there are rows in cell editing or inline editing 
      if (p.cellEdit) { 
       // savedRow has the form {id:iRow, ic:iCol, name:nm, v:value} 
       // we can call restoreCell or saveCell 
       //$grid.jqGrid("restoreCell", savedRow[0].id, savedRow[0].ic); 
       $grid.jqGrid("saveCell", savedRow[0].id, savedRow[0].ic); 
      } else { 
       // inline editing 
       for (j = len - 1; j >= 0; j--) { 
        // call restoreRow or saveRow 
        //$grid.jqGrid("restoreRow", savedRow[j].id); 
        $grid.jqGrid("saveRow", savedRow[j].id); 
       } 
      } 
     } 
    }); 
    l = clickHandlers.length; 
    if (l > 0) { 
     for (i = 0; i < l; i++) { 
      $th.bind('click', clickHandlers[i]); 
     } 
    } 
}); 

其中$grid被定义为var $grid = $("#list")。你可以看到它在the following demo上的工作方式。

+0

非常感谢,我会试一试 – 2012-02-15 16:01:24

+0

作品很棒。再次感谢。 – 2012-02-16 08:37:16

+0

@CatalinFlorea:不客气! – Oleg 2012-02-16 08:47:56

1

如果您想尝试选项2,您可以挂钩到onSortCol事件。在那里你可以取消所有行的编辑模式,然后允许排序执行。请确保不要退回"stop"或者排序不会发生。

单击可排序列后并在排序数据之前立即引发。

你可以得到所有的文件here

+0

已经尝试过。编辑网格行时不会触发。 – 2012-02-14 16:36:21