JQGrid:’beforeSelectRow’和’sortableRows’ – 排除列可拖动?

我正在使用Oleg的建议来使用beforeSelectRow事件来处理网格中单元格的点击。

奥列格在他的答案中的代码(我的答案完全模仿):

您可以使用以下按钮定义列

 { name: 'add', width: 18, sortable: false, search: false, formatter:function(){ return "" }} 

在上面的代码中,我使用jqGrid的自定义格式化程序,但没有任何事件绑定。 代码

 beforeSelectRow: function (rowid, e) { var iCol = $.jgrid.getCellIndex(e.target); if (iCol >= firstButtonColumnIndex) { alert("rowid="+rowid+"\nButton name: "+buttonNames[iCol]); } // prevent row selection if one click on the button return (iCol >= firstButtonColumnIndex)? false: true; } 

其中firstButtonColumnIndex = 8并且buttonNames = {8:'Add',9:'Edit',10:'Remove',11:'Details'} 。 在您的代码中,您可以将警报替换为相应的函数调用。

问题是我的网格也是可排序的 – (我在网格上使用sortableRows方法)。 如果用户在单击单元格时稍微移动鼠标,则永远不会触发beforeSelectRow事件(可排序事件)。

这在大多数情况下都是可取的 – 但是,我认为解决这个问题的方法是以某种方式将列从“句柄”中排除以拖动(排序)行并让我的onSelectRow事件触发这些列。 我似乎无法弄清楚如何做到这一点! 非常感谢任何帮助:)

如果添加以下附加代码,则可以解决该问题

 var grid = $('#list'), tbody = $("tbody:first",grid[0]), ptr, td; grid.bind('mouseover',function(e) { var iCol = $.jgrid.getCellIndex(e.target); if (iCol >= firstButtonColumnIndex) { tbody.sortable("disable"); } else { tbody.sortable("enable"); } }); 

如果鼠标将位于操作按钮上,则代码将禁用jqGrid的可排序function。 因此,您只能在另一列中对行进行排序。

您可以在此处查看修改过的演示。