Вопрос по jquery – jqGrid с inlineNav: есть ли способ заставить кнопку Add повторно включить?

2

Я использую jqGrid 4.3.2 сinlineNav вариант. Все редактирование в сетке выполняется локально с помощьюloadonce: true а такжеclientArray. Когда пользователь заканчивает редактирование, он нажимает кнопку сохранения в форме, и вся сетка публикуется на сервере. По большей части это прекрасно работает, но я столкнулся со странностью. Если пользователь добавляет новую строку и затем нажимает кнопку сохранения, прежде чем нажать клавишу ввода, чтобы подтвердить редактирование или отмена выбора новой добавленной строки, кнопка добавления на встроенном навигаторе остается отключенной даже после вызоваsaveRow перед публикацией и перезагрузкой. Я пробовалresetSelection а такжеrestoreRow послеsaveRow Позвони, но ни одна из этих работ. Мой код сохранения:

$("#submitButton").click(function () {
    $("#theGrid").jqGrid('saveRow', $("#selectedRowId").val(), false, 'clientArray');
    if (!ValidateGridData())
        return false;
    var rowData = $("#theGrid").jqGrid('getRowData');
    var dataToSend = JSON.stringify(rowData);
    $.ajax({
        url: '@Url.Action("UpdateGridData")',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: dataToSend,
        dataType: 'json',
        async: false,
        success: function (data, textStatus, jqXHR) {
            $("#theGrid").jqGrid('setGridParam', { datatype: 'json' });
            $("#theGrid").trigger('reloadGrid');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Error saving data: ' + textStatus + " " + errorThrown);
        }
    });
    return true;
});

Есть ли способ убедить встроенный навигатор, что новая строка сохранена и пользователь может добавить больше строк?

Ваш Ответ

1   ответ
5

InlineNav @ метода есть идентификаторы, которые построены из идентификатора сетки и соответствующего суффикса:

Add: gridId + "_iladd" (например, "list_iladd")Edit: gridId + "_iledit" (например, "list_iledit")Save: gridId + "_ilsave" (например, "list_ilsave")Cancel: gridId + "_ilcancel" (например, "list_ilcancel")

Чтобы включить кнопку, вы должны удалить'ui-state-disabled' CSS класс:

var gridId = "list";
$("#" + gridId + "list_iladd").removeClass('ui-state-disabled');

Чтобы отключить кнопку, которую можно использовать.addClass('ui-state-disabled') вместо.

Кроме того, я не рекомендую использовать какие-либо встроенные методы редактирования, такие какsaveRow напрямую. В случае, если у вас, вероятно, не будет проблемы, которую вы пытаетесь решить. Посмотрите на код ототве. Это определяетeditingRowId а такжеmyEditParam ка

var $grid = jQuery("#list"),
    editingRowId,
    myEditParam = {
        keys: true,
        oneditfunc: function (id) { editingRowId = id; },
        afterrestorefunc: function (id) { editingRowId = undefined; }
    };

, а затем используйтеinlineNav сmyEditParam параметр:

$grid.jqGrid('inlineNav', '#pager',
    { edit: true, add: true, editParams: myEditParam,
        addParams: {addRowParams: myEditParam } });

В этом случае вы можете быть уверены, чтоeditingRowId получить идентификатор текущей строки редактирования илиundefined если ни одна строка не редактируется. Так что вы можете использовать$(gridIdSelector + "_iledit").click(); вместо того EditRow для редактирования текущей выбранной строки. В том же вы можете использовать SetSelection при необходимости и имитировать нажатие на любые другие кнопки навигатора встроенного редактирования.

ОБНОВЛЕНО: Если вам нужно, вы все равно можете комбинировать вызовыsaveRow ВнутриonSelectRow, но вы можете сначала использовать переменнуюeditingRowId и секунды используютmyEditParam которые будут Общего для всех способов редактирования, которые вы используете:

onSelectRow: function (id) {
    var $this = $(this);
    if (editingRowId !== id) {
        if (editingRowId) {
            // save or restore currently editing row
            $this.jqGrid("saveRow", editingRowId, myEditParam);
            // or $this.jqGrid("restoreRow", editingRowId, myEditParam);
        }
        $this.jqGrid("editRow", editingRowId, myEditParam);
    }
}

Если вам нужны другие параметры встроенного редактирования, которые вы можете включить вmyEditParam. Вы увидите, чтоeditingRowId гораздо лучше использовать какlastSel переменная, которую вы найдете в большинстве встроенных примеров редактирования.

Я просто шел по этому пути, за исключением использования небрежногоreplace наattr('class') вместо того.removeClass. Работает отлично. Благодарность AJ.
@ AJ: Добро пожаловать! Oleg
Олег, я перебираю твои дополнительные комментарии о том, чтобы не использовать saveRow напрямую. Я использовалonSelectRow звонитьsaveRow в ранее выбранной строке, аналогично коду из Stackoverflow.com / д / 2359011/27457 ". Вы не рекомендуете использовать этот подход? AJ.
@ AJ .: Я понимаю, что вы имеете в виду. Я думаю, что в случае, если вы все еще можете хорошо Объединить встроенное редактирование с другими встроенными методами редактирования, и у вас не возникнет проблем, если вы будете следовать некоторым дополнительным правилам: см. ОБНОВЛЕНО "часть моего ответа. Oleg

Похожие вопросы