为什么关注jqGrid可编辑行的输入字段会导致行被“取消选择”?

时间:2011-08-15 04:22:20

标签: jqgrid

我有一个jqGrid实例,其中包含多选和内联编辑功能。我在beforeSelectRow事件中编写了一些代码,以便通过ctrl-key实现多项选择,并通过shift-key选择范围;以及不按任何热键的单一选择。为了启用内联编辑,我会在选择两次行时调用editRow。但是,我遇到了两个奇怪的问题:

  1. 单击可编辑行的任何字段的输入元素,将使该行成为“取消选择”
  2. 重新选择另一行进入编辑模式后,即使在目标行上正确调用restoreRow,也无法恢复上一个选定的行。
  3. - 编辑 -

    选择一行

    Select a row

    再次选择一行以进入编辑模式

    Select a row again to get into edit mode

    聚焦输入框,将“取消选择”行

    Focus the input box, will 'de-select' the row

    选择&编辑另一行,前一行无法恢复。

    Select another row, the previous row can't be restored.

    - 代码 -

            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;
        }
    

1 个答案:

答案 0 :(得分:0)

在您的代码中,您认为行按asc顺序按rowid排序(请参阅if (true == e.shiftKey))。我认为你应该更好地使用jqGrid的sortnamesortorder参数。您可以使用jQuery.nextjQuery.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