Отменить событие редактирования во встроенном редактировании jqGrid

Я использую jqgrid inline edit, в котором у меня есть сценарий для вызова события кнопки "cancel edit" и выдачи сообщения "Вы уверены, что хотите отменить?".

//Код:

//Выгрузить сетку.

$('#CommentsData').jqGrid('GridUnload');

               //Comments grid start.
               $("#CommentsData").jqGrid({

                   datastr: tableSrc,
                   hoverrows: false,
                   datatype: "jsonstring",
                   jsonReader: {
                       id: 'CommentId',
                       repeatitems: false
                   },
                   height: 'auto',
                   width: 'auto',
                   hidegrid: false,
                   gridview: true,
                   sortorder: 'desc',
                   sortname: 'DateTime',
                   pager: '#CommentsPager',
                   rowList: [],             // disable page size dropdown
                   pgbuttons: false,        // disable page control like next, back button
                   pgtext: null,            // disable pager text like 'Page 0 of 10'
                   viewrecords: false,      // disable current view record text like 'View 1-10 of 100' 
                   caption: "Comments",
                   colNames: ['DateTime', 'UserName', 'Comments'],
                   colModel: [

                       {
                           name: 'DateTime', index: 'DateTime', width: 120, formatter: "date", sorttype: "date",
                           formatoptions: { srcformat: "ISO8601Long", newformat: "m/d/Y h:i A" }
                       },
                       { name: 'UserName', index: 'UserName' },
                       { name: 'CommentText', index: 'CommentText', editable: true }],

                   //Events to add and edit comments.
                   serializeRowData: function (postdata) {

                       var filterResult;
                       var jsonResult;

                       if (tableSrc == "")
                           jsonResult = $.parseJSON(commentDetails);
                       else
                           //Parse values bind to the comments.
                           jsonResult = $.parseJSON(tableSrc);

                       var newResult = new Object();

                       //Check if operation is edit.
                       if (postdata.oper == "edit") {

                           //Filter the edited comments from main source.
                           newResult = Enumerable.From(jsonResult).Where(function (s) { return s.CommentId = postdata.id }).First();
                           newResult.CommentText = postdata.CommentText;
                       }
                       else {
                           filterResult = Enumerable.From(jsonResult).First();

                           newResult.CommentText = postdata.CommentText;
                           newResult.TransactionId = filterResult.TransactionId;
                           newResult.TaskId = filterResult.TaskId;
                       }

                       filterResult = JSON.stringify(newResult);

                       $.ajax({
                           url: '@Url.Action("UpdateComments", "Home")',
                           datatype: 'json',
                           data: { 'resultData': filterResult, 'action': postdata.oper },
                           type: 'POST',
                           success: OnCompleteComments,
                           error: function (xhr, status, error) {
                               if (xhr.statusText == "Session TimeOut/UnAuthorized") {
                                   alert(xhr.statusText);
                                   window.location.href = '@Url.Action("LogOut", "Account")';
                               }
                               else
                                   alert(xhr.responseText);
                           }
                       });
                       //After update Load the grid.
                       function OnCompleteComments(result) {
                           selectTaskComment = false;
                           $('#dialog').dialog("close");
                           myfilter = $("#TransactionsGrid").jqGrid("getGridParam", "postData").filters;
                           rowList = $('.ui-pg-selbox').val();

                           Loadgrid($("#TransactionsGrid").getGridParam('page'));

                       }

                   },

                   onSelectRow: function (id) {
                       selectTaskComment = true;
                       var thisId = $.jgrid.jqID(this.id);

                       $("#" + thisId + "_iledit").removeClass('ui-state-disabled');
                       $("#del_" + thisId).removeClass('ui-state-disabled');

                       var selectValues = jQuery('#CommentsData').jqGrid('getRowData', id);
                       thisId = $.jgrid.jqID(this.id);

                       if (selectValues.UserName == '@ViewBag.UserName' || '@ViewBag.IsAdmin' == 'True') {
                           $("#" + thisId + "_iledit").removeClass('ui-state-disabled');
                           $("#del_" + thisId).removeClass('ui-state-disabled');

                       }
                       else {

                           $("#" + thisId + "_iledit").addClass('ui-state-disabled');
                           $("#del_" + thisId).addClass('ui-state-disabled');

                       }

                   }

               });

               jQuery("#CommentsData").jqGrid('navGrid', '#CommentsPager', { edit: false, add: false, del: true, search: false, refresh: false }, {}, {},

                   {
                       //Delete event for comments
                       url: '@Url.Action("UpdateComments", "Home")',
                       serializeDelData: function (postData) {
                           return {
                               resultData: JSON.stringify(postData.id),
                               action: JSON.stringify(postData.oper),
                           }
                       },
                       errorTextFormat: function (xhr) {
                           if (xhr.statusText == "Session TimeOut/UnAuthorized") {
                               window.location.href = '@Url.Action("LogOut", "Account")';
                           } else {
                               return xhr.responseText;
                           }
                       },
                       beforeSubmit: function () {

                           myfilter = $("#TransactionsGrid").jqGrid("getGridParam", "postData").filters;
                           return [true, '', ''];
                       },
                       afterSubmit: function (response, postdata) {
                           selectTaskComment = false;
                           Loadgrid($("#TransactionsGrid").getGridParam('page'));

                           return [true, '', ''];
                       }

                   });

                   $('#CommentsData').jqGrid('inlineNav', '#CommentsPager', { edit: true, add: true, save: true, del: false, cancel: true });

                   $("#CommentsData_iledit").addClass('ui-state-disabled');
                   $("#del_CommentsData").addClass('ui-state-disabled');

В каком случае я должен написать код и выдать предупреждающее сообщение?

Также, если возможно, нужно знать, можно ли оптимизировать приведенный выше код. Потому что событие удаления прописано в отдельном месте, сравнивая редактирование и добавление. Я немного смущен, если это правильный метод.


person A Coder    schedule 04.12.2014    source источник


Ответы (1)


Самый простой способ вызвать кнопку «отменить редактирование» — выполнить код

$("#CommentsData_ilcancel").click(); // trigger click event on Cancel button

где CommentsData — идентификатор сетки.

person Oleg    schedule 04.12.2014
comment
Это работает слишком хорошо. Но есть ли способ, как у нас, для добавления, редактирования и удаления onclickSubmit? что-то подобное? - person A Coder; 04.12.2014
comment
@SanthoshKumar: встроенное редактирование не имеет onclickSubmit (он есть только у Delete), но вы можете использовать обратный вызов beforeSaveRow, который имеет два параметра: option и rowid. Вы можете вернуть false из обратного вызова, чтобы отправить заявку. Вернуть true или undefined означает разрешить сохранение строки. - person Oleg; 04.12.2014
comment
Мой метод встроенного редактирования правильный? Верно? - person A Coder; 04.12.2014
comment
@SanthoshKumar: я не понимаю, что вы имеете в виду. Выбор режима редактирования (встроенное редактирование, редактирование формы или редактирование ячеек) зависел от требований проекта. Даже если вы выберете встроенное редактирование, у вас есть возможность начать редактирование напрямую (вызов editRow) при щелчке по строке, при двойном щелчке по строке и так далее. Вы можете использовать formatter: "actions" или inlineNav. - person Oleg; 04.12.2014
comment
@SanthoshKumar: Выбор сильно зависит от ваших требований. Например, вы используете сетку без пейджера. Я надеюсь, что вы установили rowNum на достаточно большое значение, чтобы увидеть больше первых 20 строк на странице. В случае большого количества строк, пользователю придется прокрутить вниз, чтобы начать/остановить редактирование. Это явный недостаток. В качестве альтернативы можно использовать контекстное меню с теми же действиями. Другой пример: можно сохранить или удалить строки редактирования, щелкнув другую строку. Выбор зависит от требований проекта. Таким образом, у вас есть много альтернатив, и выбор зависит от требований. - person Oleg; 04.12.2014
comment
Правильно Олег. Но я спрашивал, что код, который я упомянул выше для встроенного редактирования, правильный и простой. Я думал, что часть кодирования не подходит для метода, который я использовал. Поэтому. - person A Coder; 04.12.2014
comment
@SanthoshKumar: Многие части опубликованного кода мне непонятны. Вы используете Enumerable.From(jsonResult). Что это? Вы вызываете функцию Loadgrid. Что оно делает? Где код? Вы используете необъявленные commentDetails или tableSrc внутри serializeRowData. Все выглядит очень странно. Вы используете serializeRowData совершенно неправильно. Обратный вызов будет вызываться для сериализации объекта postdata перед вызовом Ajax. Вместо этого вы не возвращаете никаких данных и делаете отдельный запрос Ajax. Так много деталей выглядит для меня неясным, странным и подозрительным, потому что я не понимаю ваших целей. - person Oleg; 04.12.2014
comment
Спасибо за подробный комментарий. Я опубликую это как новый вопрос с демонстрацией. Спасибо еще раз. - person A Coder; 05.12.2014