Почему фокусировка на поле ввода редактируемой строки jqGrid приводит к тому, что строка «отменяется»? - PullRequest
0 голосов
/ 15 августа 2011

У меня есть экземпляр jqGrid, который отличается множественным выбором и встроенным редактированием.Я написал некоторый код в событии beforeSelectRow, чтобы множественный выбор можно было получить с помощью клавиши Ctrl, а выбор диапазона - с помощью клавиши Shift;а также одиночный выбор без нажатия какой-либо горячей клавиши.Чтобы включить встроенное редактирование, я позвоню editRow, когда строка будет выбрана дважды.Однако я сталкиваюсь с двумя странными проблемами:

  1. Щелчок по элементу ввода любого поля редактируемой строки приведет к тому, что строка будет «отменена»
  2. После перезапуска- выбрав другую строку для перехода в режим редактирования, предыдущая выбранная строка не может быть восстановлена, даже если restoreRow правильно вызван в целевой строке.

- EDITED -

Выберите строку

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 голосов
/ 15 августа 2011

В вашем коде вы предполагаете, что строки отсортированы по rowid в порядке возрастания (см. if (true == e.shiftKey)).Я думаю, вам лучше использовать sortname и sortorder параметры jqGrid.Более того, вы можете использовать jQuery.next или jQuery.prev , чтобы перейти к следующему или предыдущему элементу <tr>.

Более того, я не понимаю, почему вы используете$this.data(key_selected_rows) вместо стандартного this.p.selarrrow.

Извините, но я бы порекомендовал вам переписать вашей программы и использовать дополнительные свойства DOM <tr> (строка сетки) и <table> элементы.Например, свойство rowIndex в <tr> может дать вам индекс строки в коллекции row элемента <table>.Вы можете получить следующую / предыдущую строку, просто используя this.rows[index+1] или this.rows[index+1] (this в beforeSelectRow указывает на DOM-представление элемента <table>).

К вашему основному вопросу: если вы хотите предотвратить выбор или отмена выбора строки в некоторых ситуациях, вы должны вернуть false из beforeSelectRow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...