Как изменить значение столбца id в редактировании формы

Я ищу способ изменить значение столбца id с помощью редактирования формы.

Я попробовал код ниже: выбрал строку, нажал кнопку редактирования формы и изменил anda и id. После нажатия кнопки отправки значение столбца идентификатора в сетке не изменяется. Как также изменить значение столбца идентификатора?

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.11.4/themes/redmond/jquery-ui.css"/>
    <link rel="stylesheet" type="text/css" href="http://cdn.jsdelivr.net/free-jqgrid/4.8.0/css/ui.jqgrid.css"/>
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    <script type="text/javascript" src="http://cdn.jsdelivr.net/free-jqgrid/4.8.0/js/i18n/grid.locale-en.js"></script>
    <script type="text/javascript">
        $.jgrid = $.jgrid || {};
        $.jgrid.no_legacy_api = true;
        $.jgrid.useJSON = true;
    </script>
<script src="http://rawgit.com/free-jqgrid/jqGrid/master/js/jquery.jqgrid.src.js"></script>
    <script type="text/javascript">
        $(function () {
            "use strict";
            var mydata = [ { name: 'name', id:'id'}
                ],
                $grid = $("#list");

            $grid.jqGrid({
                datatype: "local",
                data: mydata,
                colNames: ["Client", "Id"],
                colModel: [
                    { name: "name",  editable: true },
                    { name: "id", editable: true }
                ],
                iconSet: "fontAwesome",
                pager: "#pager",
                gridview: true,
                autoencode: true,
                ignoreCase: true,
                onSelectRow: function (rowid) {
                    var $self = $(this),
                        savedRow = $self.jqGrid("getGridParam", "savedRow");
                    if (savedRow.length > 0) {
                        $self.jqGrid("restoreRow", savedRow[0].id);
                    }
                    $self.jqGrid("editRow", rowid, {
                        keys: true
                    });
                }
            })

.jqGrid('navGrid', {}, {},
{
//           afterSubmit: function (response, postdata) {
//postdata.id='100';
//               return [true, '']; //, '100'];
// }
})
;

        });
    //]]>
    </script>
</head>
<body>
    <table id="list"><tr><td></td></tr></table>
    <div id="pager"></div>
</body>
</html>

person Andrus    schedule 10.04.2015    source источник
comment
@Oleg: Я пытался, но проблема не устранена. Более подробно я описал проблемы в комментариях к вашему ответу. В моем приложении используются естественные первичные ключи, и пользователям нравится изменять их в форме и редактировать несколько раз. Мы обсуждали это в другом ответе несколько лет назад, и вы рекомендовали использовать суррогатные идентификаторы, но это выходит за рамки этого вопроса. В настоящее время после изменения идентификатора требуется полноэкранное обновление, прежде чем строку можно будет снова отредактировать. Я ищу способ избежать этого дополнительного обновления экрана   -  person Andrus    schedule 11.04.2015


Ответы (1)


Я не могу проверить это, но я думаю, что использование

afterSubmit: function (response, postdata) {
    postdata.id='100';
    return [true, '', '100'];
}

должно сработать. Я думаю, что вы можете изменить любой даже нередактируемый столбец таким образом, но только в случае добавления новой строки.

Единственным исключением может быть столбец id из-за строка (или строка jqGrid 4.7).

Чтобы убедиться, что это не так, я модифицировал код бесплатного jqGrid еще раз. Вы должны попробовать с последними источниками бесплатного jqGrid

person Oleg    schedule 10.04.2015
comment
Вопрос касался обновления идентификатора существующей строки с помощью редактирования формы. Я повторно протестировал рассматриваемый код, который использует jqgrid из мастера github, но проблема не устранена: нажатие кнопки редактирования, изменение столбца идентификатора и нажатие кнопки отправки по-прежнему показывает старое значение идентификатора в столбце jqgrid. - person Andrus; 11.04.2015
comment
Я добавил postdata.id='changed id in form' для редактирования формы метода afterSubmit. В этом случае сетка показывает новый идентификатор, но попытка снова отредактировать строку по-прежнему отправляет старый идентификатор на сервер. Как заставить jqgrid публиковать новый идентификатор на сервере после того, как идентификатор изменен в форме, а после этого строка снова отредактирована? Если идентификатор изменен с помощью встроенного редактирования, измененная строка с новым идентификатором может быть отредактирована без проблем. - person Andrus; 11.04.2015
comment
@Andrus: Я уверен, что во время написания ответа в колонке id в тексте вашей колонки нет нет editable: true. Вы не можете просто изменить вопрос, потому что мой старый ответ будет не более правильным! Если у вас есть редактируемый столбец с name "id" и без key: true, то у вас есть конфликты имен, и вы можете изменить имя rowid, которое будет отправлено на сервер: prmNames: { id: "newIdName" } - person Oleg; 11.04.2015
comment
Вы можете щелкнуть все изменения действий от моего имени. По этому вопросу нет никаких изменений. Также я не помню, чтобы я изменил это. Аналогичные тесты есть и в других вопросах. В других квестах id всегда только для чтения, но для этого вопроса я специально делаю id редактируемым. Так что, похоже, я никак не изменил этот вопрос. Возможно, мне следует создать более реальный тестовый набор, но я не знаю, как предоставить для него удаленные контроллеры. - person Andrus; 11.04.2015
comment
@Andrus: Извините, кажется, я ошибаюсь, и я перепутал код с другими кодами, которые вы разместили, потому что я ответил на вопросы параллельно. Тем не менее, вы пытались переименовать rowid, отправляемый на сервер, на другое имя? Имя по умолчанию для старого идентификатора строки (которое "_empty" в случае формы добавления) — "id", если вам нужно использовать имя в качестве имени столбца, тогда вам нужно использовать что-то вроде prmNames: { id: "oldRowId" }. В случае, если rowid будет отправлен под именем "oldRowId", а "id" будет из редактируемого столбца "id". - person Oleg; 11.04.2015
comment
Добавление prmNames: {id: "_rowid"}, и mydata = [{ _rowid: 'id', name: 'name', id:'id'}] к примеру кода устраняет рассматриваемую проблему. Однако, если используются удаленные данные json, старый идентификатор по-прежнему публикуется в методе редактирования сервера, если эта строка редактируется снова. postdata.id='100' обновляет только столбец идентификатора. Я попытался добавить postdata._rowid='100', но старый идентификатор строки все еще публикуется в контроллере редактирования сервера после редактирования формы. Если используется только встроенное редактирование, измененный идентификатор публикуется правильно как _rowid. - person Andrus; 12.04.2015
comment
jqgrid заполняется из удаленных данных json в форме {"total":2,"page":1,"rows":[{"id":"oldid","cell":[null,"oldid","test... Похоже, что postdata изменяет только часть данных ячейки. oldid публикуется снова, даже если значение id изменяется с помощью postdata.id='newid' в методе редактирования afterSubmit. Возможно, значение id из данных используется как идентификатор элемента ‹tr›. Как изменить идентификатор строки jqgrid? Возможно, можно использовать метод afterComplete. - person Andrus; 12.04.2015
comment
@Andrus: Должен быть полный сценарий с тестовыми данными. Ваш вопрос касался игнорирования нового идентификатора, возвращенного от afterSubmit. Это означает, что вопрос о операции добавления в форме редактирования. Более того, это означает, что вы используете опцию reloadAfterSubmit: false дополнительно. Если данные будут перезагружены (по умолчанию), то ничего делать не требуется. Какой сценарий вы имеете в виду сейчас? Это операция редактирования (вместо добавления ранее) редактирования формы? Если у вас есть четкий демонстрационный пример (например, в jsfiddle) и тестовый пример, то вы можете легко понять проблему и исправить что-то, если это необходимо. - person Oleg; 12.04.2015
comment
@Andrus: см. демонстрацию как пример демонстрации jqGrid, в которой используются удаленные данные. - person Oleg; 12.04.2015
comment
Я разместил вопрос, содержащий полный тестовый пример, в stackoverflow.com/questions/29588844/ - person Andrus; 12.04.2015
comment
Я исследовал проблему, используя тестовый пример в stackoverflow.com/questions/29588844/ Вчера строка исходного кода github jquery.jqgrid.src.js 10026 содержит $self.jqGrid("setRowData", postdata[idname], postdata);, но setRowData не устанавливает идентификатор для удаленного JSON-данные. Как это исправить? - person Andrus; 13.04.2015
comment
@Andrus: Линия не новая. См., например, здесь . Если вы хотите изменить атрибут id строки, вы должны установить его явно. Напоминаю, что мы уже обсуждали эту тему. Я думаю, что нужно сделать дизайн базы данных таким, чтобы никакие идентификаторы не менялись при редактировании, только при создании новых элементов. Это гарантирует отсутствие конфликтов идентификаторов. Тем не менее, я опубликую позже свой ответ с идеей возможного обходного пути. - person Oleg; 13.04.2015
comment
Спасибо. Я обновил тестовый пример в stackoverflow.com/questions/29588844/ и добавить предлагаемый обходной путь. Проблема сохраняется. Новый идентификатор передается в attr() в afterComplete, но старый идентификатор по-прежнему передается на сервер при втором редактировании. - person Andrus; 14.04.2015