Изменение редактируемого свойства текстового столбца jqGrid на основе результатов автозаполнения в другом столбце

Я использую jqGrid 4.4.0 со встроенным редактированием. Ради этого вопроса моя сетка имеет четыре столбца :столбец идентификатора (SomeGridRowId ), текстовый столбец с автозаполнением jQuery (автозаполнение ), текстовый столбец с одним символом (SingleChar )и скрытый booleanстолбец (CanEditSingleChar ). Мне нужно включить или отключить редактирование столбца с одним символом на основе значения столбца CanEditSingleChar. У меня это работает с существующими строками, используя onSelectRowи setColProp, но по какой-то причине я не могу заставить его правильно работать с вновь вставленными строками. Если я добавлю новую строку и выберу значение из автозаполнения, столбец SingleCharбудет всегда недоступным для редактирования. Я прошел через Javascript, используя инструменты разработчика Chrome и IE; значения и свойства столбца устанавливаются правильно, но свойство editableстолбца SingleCharне отражает этого.

Прошу прощения за гигантский фрагмент кода, но я не хочу ничего упускать.

$("#coolGrid").jqGrid({
    url: '@Url.Action("GetCoolGridData")',
    postData: {
        someId: function () { return $("#someId").val(); },
        otherStaticArg: function () { return 1; }
    },
    datatype: 'json',
    mtype: 'POST',
    loadonce: true,
    cellsubmit: 'clientArray',
    editurl: 'clientArray',
    scroll: true,
    pager: $("#coolGridPager"),
    rowNum: 200,
    sortname: 'SomeGridRowId',
    sortorder: 'asc',
    viewrecords: true,
    height: '100%',
    colNames: ['SomeGridRowId', 'CanEditSingleChar', 'Autocomplete', 'SingleChar'],
    colModel: [
        { name: 'SomeGridRowId', index: 'SomeGridRowId', hidden: true },
        { name: 'CanEditSingleChar', index: 'CanEditSingleChar', hidden: true }, 
        {
            name: 'Autocomplete',
            index: 'Autocomplete',
            width: 220,
            editable: true,
            edittype: 'text',
            editoptions: {
                dataInit: function (elem) {
                    $(elem).autocomplete({
                        source: '@Url.Action("GetSomeGridAutocomplete")',
                        minLength: 2,
                        select: function (event, ui) {
                            var rowId = getRowId($(this));
                            if (ui.item) {
                                $("#coolGrid").jqGrid('setCell', rowId, 'CanEditSingleChar', ui.item.CanEditSingleChar, '', '');
                                $("#coolGrid").jqGrid('setCell', rowId, 'Autocomplete', ui.item.label, '', '');
                                setSingleCharEditMode(rowId);
                            }
                        }
                    });
                }
            }
        },
        {
            name: 'SingleChar',
            index: 'SingleChar',
            width: 10,
            editable: true,     //default to true, most are editable
            edittype: 'text'
        }
    ],
    onSelectRow: function (clickedRow) {
        if (clickedRow && clickedRow != $.coolGridLastSelectedRow) {
            $("#coolGrid").jqGrid('saveRow', $.coolGridSelectedRow, false, 'clientArray');
            $.coolGridLastSelectedRow = clickedRow;
        }
        setSingleCharEditMode($.coolGridLastSelectedRow);
        $("#coolGrid").jqGrid('editRow', $.coolGridLastSelectedRow, true);
    },
    afterInsertRow: function (rowid, rowdata, rowelem) {
        if (rowid == 'new_row') {       //shown solely for completeness, pretty sure this is not the problem
            var newRowIndex = $("#coolGridNewRowIndex").val();
            if (!newRowIndex)
                newRowIndex = 1;
            var newRowId = rowid + "_" + newRowIndex;
            $("#new_row").attr('id', newRowId);
            newRowIndex++;
            $("#coolGrid").val(newRowIndex);
            $("#coolGrid").jqGrid('setSelection', newRowId, true);
        }
    }
});
$("#coolGrid").jqGrid('navGrid', '#coolGridPager',
{
    add: false,
    del: false,
    edit: false,
    search: false,
    beforeRefresh: function () {
        $("#coolGrid").jqGrid('setGridParam', { datatype: 'json' });
    }
});
$("#coolGrid").jqGrid('inlineNav', '#coolGridPager',
{
    edit: false,
    add: true,
    addtext: "Add",
    save: false,
    cancel: false,
    restoreAfterSelect: false,
    addParams: {
        position: 'last',
        addRowParams: {
            keys: true
        }
    }
});

И функция setSingleCharEditMode:

function setSingleCharEditMode(rowid) {
    var rowData = $("#coolGrid").jqGrid('getRowData', rowid);
    if (rowData.CanEditSingleChar === "false") {
        $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: false });
    } else {
        $("#coolGrid").jqGrid('setColProp', 'SingleChar', { editable: true });
    }
}

Я перепробовал множество вещей, просмотрел кучу других вопросов SO, гуглил как сумасшедший.... все безрезультатно. Я прибегла к выдергиванию волос. Как я могу управлять свойством editableодного столбца после автозаполнения selectв другом столбце, все в новой строке?

РЕДАКТИРОВАТЬ
Наконец-то у меня есть рабочий пример . Если вы добавите строку, а затем выберите один из «Нетипичный *» в столбце Autocomplete, вы можете воспроизвести это поведение.

7
задан AJ. 9 July 2012 в 20:11
поделиться