我有一个jqGrid实例,其中包含多选和内联编辑功能。我在beforeSelectRow
事件中编写了一些代码,以便通过ctrl-key实现多项选择,并通过shift-key选择范围;以及不按任何热键的单一选择。为了启用内联编辑,我会在选择两次行时调用editRow
。但是,我遇到了两个奇怪的问题:
restoreRow
,也无法恢复上一个选定的行。- 编辑 -
选择一行
再次选择一行以进入编辑模式
聚焦输入框,将“取消选择”行
选择&编辑另一行,前一行无法恢复。
- 代码 -
beforeSelectRow: function (rowid, e) {
var $this = $(this);
var url_for_save_edit = this.p.editurl;
var last_selected_row = this.p.selrow;
var cur_selected_rows = $this.data(key_selected_rows);
if (true == e.shiftKey) {
if (rowid != last_selected) {
var min = parseInt((rowid < last_selected_row ) ? rowid : last_selected_row );
var max = parseInt((rowid > last_selected_row ) ? rowid : last_selected_row );
for (var i = min + 1; i < max; i++) {
$this.jqGrid(method_setSelection, i, false);
}
}
} else if (false == e.ctrlKey) {
$this.resetSelection();
if (!$.string.isNullOrEmpty(url_for_save_edit)) {
if (!$.isNull(cur_selected_rows) && (cur_selected_rows.length <= 1) && (rowid == last_selected_row)) {
var curr_edit_row = $this.data(key_curr_edit_row);
console.log('>>>>> curr selected rows = ', cur_selected_rows, ', last selected row = ', last_selected_row, 'curr editing row = ', curr_edit_row, ', to be editable row: ', rowid);
if (rowid != curr_edit_row) {
if (!$.isNull(curr_edit_row)) {
console.log('>>>>> restoring row ', curr_edit_row);
$this.jqGrid('restoreRow', curr_edit_row, null);
}
console.log('>>>>> set row as editable: ', rowid);
$this.jqGrid('editRow', rowid, false, null, null, null, null, null, null, null);
$this.data(key_curr_edit_row, rowid);
}
}
}
}
return true;
}
答案 0 :(得分:0)
在您的代码中,您认为行按asc顺序按rowid排序(请参阅if (true == e.shiftKey)
)。我认为你应该更好地使用jqGrid的sortname
和sortorder
参数。您可以使用jQuery.next或jQuery.prev转到下一个或上一个<tr>
元素。
此外,我不明白您使用$this.data(key_selected_rows)
代替标准this.p.selarrrow
的原因。
抱歉,我建议您重写您的程序,并使用<tr>
(网格行)和<table>
元素的更多DOM属性。例如,<tr>
的{{3}}属性可以为您提供<table>
元素的rowIndex集合中行的索引。您可以使用this.rows[index+1]
或this.rows[index+1]
(this
中的beforeSelectRow
指向<table>
元素的DOM表示来获取下一行/上一行。
对于您的主要问题:如果您想在某些情况下阻止行选择或取消选择,您应该从false
返回beforeSelectRow
。