JqGrid - Встроенное редактирование - Обнаружение грязных/измененных ячеек

есть ли пример использования jqgrid getChangedCells метод, чтобы определить, изменились ли данные?

I grepped getChangedCells в загружаемых демонстрационных версиях для jqgrid, и может найти только определение функции, а не пример использования getChangedCells.

Что я хочу сделать, это сохранить изменения, которые пользователь если пользователь нажимает на другую строку. Но, я только хотите отправить сохранение, если строка грязная.

Спасибо заранее, --Nate

Ответ 1

В строке нет безопасного грязного флага. Вы можете использовать тот факт, что в начале редактирования строки (в начале встроенного режима редактирования) метод editRow добавить атрибут editable="1" к строке сетки (элемент <tr>). Позже методы saveRow и restoreRow изменяет значение атрибута editable="0". Таким образом, строки текущей страницы, которые были хотя бы один раз в режиме встроенного редактирования, будут иметь атрибут editable. Если идентификатор элемента таблицы является "списком", вы можете найти отредактированные строки с помощью

$("#list tr[editable]")

Иды элементов набора являются rowid строк.

Если вы используете пейджинг в сетке, вы должны быть осторожны и сохранять идентификаторы отредактированных строк на текущей странице перед сменой страницы. Событие onPaging поможет вам здесь.

На мой взгляд, лучший и самый безопасный способ сделать то, что вам нужно, - использовать параметр aftersavefunc editRow или saveRow (возможно, вы используете непосредственно только editRow). Внутри вашей функции aftersavefunc вы можете сохранить идентификатор измененной строки в массиве/карте. Это решит вашу проблему и будет безопасно работать.

Ответ 2

Наконец, мне удалось принести фрагмент кода, чтобы обнаружить, что мы хотим;)

Надеемся, что у всех jqgrid-гуру (например, Oleg) у вас будет достаточно времени, чтобы просмотреть этот код и улучшить его.

Пример кода будет работать для обнаружения данных, измененных в сетке с редактируемым полем с именем "name" . Если вы хотите проверить измененные данные в большем количестве столбцов, вам необходимо добавить переменные after_edit и before_edit, связанные с этими столбцами.

Чтобы получить предыдущие данные ячейки внутри функции onSelectRow, я не использовал метод getCell, потому что в документации написано красным:

Не используйте этот метод, когда вы редактируете строку или клетка. Это вернет содержимое ячейки, а не фактическое значение входного элемента

По неосторожности я мог проверить правильность документации:(. Однако функция getCell корректно работает с текущими данными ячейки.

И вот код:

 // Declare variables used for inline edit functionality.
 var last_selected;
 var before_edit_value;
 var after_edit_value;
 $('#grid-id').jqGrid({
...

onSelectRow: function(row_id){
    if(row_id && row_id !== last_selected) {
        /*
         * Determine if the value was changed, if not there is no need to save to server.
         */
         if (typeof(last_selected) != 'undefined') {
            after_edit_value = $('#grid-id tr#' + last_selected + ' .name_column input').val();
         }

        if (before_edit_value != after_edit_value) {
            /*
             * Save row.
             */
            $('#grid-id').jqGrid(
                'saveRow', 
                last_selected, 
                function(response){
                    /* SuccessFunction: Do something with the server response */

                    return true;    
                }, 
                'http://url.to.server-side.script.com/server-side-script.php', 
                {
                    additional_data: 'example: additional string',
                });
            }
            else {
                /*
                 * Restore the row.
                 */
                $('#grid-id').jqGrid('restoreRow', last_selected);
            }

        before_edit_value   = $('#grid-id').jqGrid('getCell', row_id, 'name');
    }   

    last_selected       = row_id;

    /*
     * Edit row.
     */
    $('#grid-id').jqGrid(
        'editRow', 
        row_id, 
        true, 
        function() {/* OnEditFunction */}, 
        function(response) {
        /* SuccessFunction: Do something with the server response */

        return true;

    }, 
    'http://url.to.server-side.script.com/server-side-script.php', 
    {
        additional_data: 'example: additional string',
    }); 
   },
...
});

Ответ 3

В одном из моих проектов я сделал следующее: перед редактированием строки я помню данные о строках в глобальной переменной и после того, как редактирование сделано, просто проверьте, были ли изменены данные о строках. Что-то вроде этого (режим редактирования активируется двойным щелчком):

var beforeEditData;

function onGridDblClickRow(id) {
  if (isRowEditable(id)) {
    beforeEditData = grid.getRowData(id);
    grid.editRow(id, true, null, null, 'clientArray', null, onRowAfterEdit);
    ...
  }
}
function onRowAfterEdit(row) {
  var data = grid.getRowData(row);
  if (!isDataChanged(beforeEditData, data)) {        
    return; // No changes
  }
  ... // Save data here
}
function isDataChanged(before, after){
  ... // Allows tricky logic for dirty data, e.g. one may trim spaces etc.
}

код >

Ответ 4

Используя MVC4 и JQuery, это то, что я сделал

В представлении

<script type="text/javascript">

var $grid = $("#Grid");
var lastSelection;
var datachanged = false;

function gridInitialised() {
    var headers = $('th>div>:input');
    for (var h = 0; h < headers.length; headers[h++].onclick = (function () { if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; } }));
}

function editRow(id) {
    if (id && id !== lastSelection) {
        if (datachanged) { $grid.saveRow(lastSelection); datachanged = false; }
        $grid.restoreRow(lastSelection);
        $grid.editRow(id, true);
        var inputs = $('#'+id+'>td>:input[class="editable"]');
        for (var i = 0; i < inputs.length; inputs[i++].onchange = (function () { datachanged = true; }));
        lastSelection = id;
    }
}
</script>

@Html.Trirand().JQGrid(Model.Grid, "Grid")

в модели

            Grid.ClientSideEvents.RowSelect = "editRow";
            Grid.ClientSideEvents.GridInitialized = "gridInitialised";

Составленный сетью код предназначен для обработки изменений в поисковом фильтре.

Dave

Ответ 5

Поскольку Олег упомянул 5 (вау) лет назад - я использовал функцию saveRow и передал флаг как extraparam.

что-то вроде этого, предполагая вашу "модель" или скрытый столбец IsDirty в моем случае:

onSelectRow: function(id) {
                if (id && id !== lastgridsel) {
                    $("#myGrid").saveRow(lastgridsel, false, "clientArray", { IsDirty: "True" });
                    $("#myGrid").editRow(id, true, null, null, "clientArray");
                    lastgridsel = id;
                }
            },

а затем прокрутите строки по нажатию "Сохранить" (внешняя кнопка в моем случае), что-то вроде строк:

$("#gridSaveBtn").on("click", function() {
            var batch = new Array();
            var dataIds = $("#myGrid").jqGrid("getDataIDs");
            for (var i = 0; i < dataIds.length; i++) {
                try {
                    $("#myGrid").jqGrid("saveRow", dataIds[i], false, "clientArray");
                    //get row data
                    var data = $("#myGrid").jqGrid("getRowData", dataIds[i]);
                    if (data["IsDirty"] === "True") {
                        batch.push(data);
                    }
                } catch (ex) {
                    alert(ex.Message);
                    $("#myGrid").jqGrid("restoreRow", dataIds[i]);
                }
            }
        });