Создание ячеек JqGrid для редактирования - PullRequest
1 голос
/ 01 апреля 2012

Моя цель - встроить редактирование ячеек в сетку данных, используя JQuery и JqGrid. Я получил сетку для заполнения на основе запроса ajax и ответа json. К сожалению, я не могу заставить ячейки становиться редактируемыми при щелчке по строкам.

Я пробовал и Chrome, и Safari, и провел два дня исследований, но все еще не повезло. Ссылки, которые я использовал ниже, не помогли:

http://trirand.com/blog/jqgrid/jqgrid.html

http://www.trirand.net/demoaspnetmvc.aspx

Следуя инструкциям, я добавил событие onRowSelect, которое вызвало бы editRow и установило значение true. Однако это никогда не работает, и я не могу понять, почему.

Любая помощь будет принята с благодарностью.

Код:

<html>
<head>
    <title>Test</title>

    <link rel="stylesheet" type="text/css" href="ui.jqgrid.css"/>
    <link rel="stylesheet" type="text/css" href="jquery-ui-1.8.2.custom.css"/>

    <style type="text/css">
    html, body {
        margin: 0;
        padding: 0;
        font-size: 75%;
    }
    </style>


    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
    <script src="i18n/grid.locale-en.js" type="text/javascript"></script>
    <script src="jquery.jqGrid.min.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(document).ready(function() {

            jQuery("#list").jqGrid({
                        url:'http://localhost:8080/jblog/messages',
                        datatype:'json',
                        jsonReader: {
                            root: 'rows',
                            repeatitems: false,
                            page:  'currentPage',
                            total: 'totalRecords'
                        },
                        mtype:'GET',
                        colNames:['Message ID', 'Message Content'],
                        colModel:[
                            {name:'messageId', index:'messageId'},
                            {name:'content', index:'content', width:'400'}
                        ],
                        viewrecords:true,
                        caption:'My first grid',
                        rowNum:30,
                        rowList:[10,20,30],
                        pager: '#pager',
                        sortname: 'messageId',
                        onSelectRow: function(id){
                            console.log('onSelectRow');
                            editRow(id);
                            },
                        editurl:'http://localhost:8080/jblog/messages'
                    });
        });
    </script>

</head>
<body>
<table id="list">
    <tr>
        <td/>
    </tr>
</table>
<div id="pager"></div>
<script type="text/javascript">
           var lastSelection;

           function editRow(id) {
               console.log("editRow");
               if (id && id !== lastSelection) {
                   console.log("setRowToEdit");
                   var grid = $("#list");
                   grid.restoreRow(lastSelection);
                   console.log("id " + id);
                   grid.editRow(id, true);
                   lastSelection = id;
               }
           }
</script>
</body>
</html>

1 Ответ

1 голос
/ 01 апреля 2012

Основная ошибка в вашем коде:

  • Вы должны включить editable: true свойство в столбцы, которые нужно редактировать.

Дополнительно необходимо внести следующие изменения в код:

  • Вы должны включить <!DOCTYPE html ...> строку перед <html>, которая объявляет диалект HTML / XHTML, который вы используете. Если вы используете диалект HTML5, строка будет просто <!DOCTYPE html>. В вашем случае это может быть строка <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">, которая соответствует XHTML 1.0 Strict. Подробнее см. в документации .
  • Я рекомендую вам уменьшить количество глобальных переменных. Переменная lastSelection и функция editRow должны находиться в области видимости onSelectRow. Таким образом, вы можете переместиться туда внутри блока $(document).ready(function() {/*here!!!*/});. Я бы порекомендовал вам лучше использовать анонимные функции и размещать код editRow непосредственно в коде onSelectRow. Кстати, вы можете использовать $(this) вместо $("#list") внутри onSelectRow. Это делает код немного быстрее и улучшает обслуживание кода, потому что вы можете легче вырезать и вставлять фрагменты кода.
  • вы никогда не должны использовать префиксы, такие как http://localhost:8080/ в запросах Ajax (см. Опции url и editurl). Вместо этого вы должны использовать url:'/jblog/messages' или url:'jblog/messages' URL. Доступ к другому серверу в качестве текущего сервера, с которого загружается текущая страница, или доступ к другому порту запрещен из-за той же политики происхождения Ajax.
  • Я рекомендую всегда использовать gridview: true опции jqGrid, которые могут улучшить производительность сетки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...