Как установить значения по умолчанию, если строка добавляется с помощью встроенной кнопки добавления в jqgrid

Код ниже устанавливает значения по умолчанию для новой строки, если строка добавляется с помощью формы. Если строка добавляется с помощью встроенной кнопки добавления jqGrid на панели инструментов, эти методы не вызываются и значения по умолчанию не устанавливаются.

Как заставить inline add выполнять ту же логику, что и код ниже?

var lastSelectedRow;
$grid.navGrid("#grid_toppager", { 
del: true,
add: true,
view: true,
edit: true
          }, 
          {},

       { 
       addedrow: 'beforeSelected',
       url: '/Grid/Add?_entity=Desktop',
       beforeInitData: function () {
         // todo: how to call this method from inline add
         var rowid = $grid.jqGrid('getGridParam', 'selrow');
         if (rowid === null) {
           alert( 'Select row before adding');
           return false;
           }
         },

       afterShowForm: function(formID) {
         // todo: how to set default values as this method sets from inline add
         var selRowData, 
            rowid = $grid.jqGrid('getGridParam', 'selrow');
         $('#' + 'Recordtype' + '.FormElement').val('Veerg');
         $('#' + 'Nait2' + '.FormElement')[0].checked = true;
         selRowData = $grid.jqGrid('getRowData', rowid);
         $('#' + 'Baas' + '.FormElement').val(selRowData.Baas);
         $('#' + 'Liigid' + '.FormElement').val(selRowData.Liigid);
       }
       );


$grid.jqGrid('inlineNav', '#grid_toppager', {
    addParams: {
        position: "beforeSelected", 
        rowID: '_empty',
        useDefValues: true,
        addRowParams: {
            keys: true,
            onEdit :  onInlineEdit
        }
    },

    editParams: {
        editRowParams: {
            onEdit : onInlineEdit
            }
    },

   add: true,
   edit: false,
   save: true,
   cancel: true
}); 

function onInlineEdit(rowId) {
  if (rowId && rowId !== lastSelectedRow) {
        cancelEditing($grid);
        lastSelectedRow = rowId;
    }
  }

Обновить

Я пробовал код

 $grid.jqGrid('inlineNav', '#grid_toppager', {
    addParams: {
        position: "beforeSelected", 
        rowID: '_empty',
        useDefValues: true,
        addRowParams: {
            keys: true,
            extraparam: { _dokdata: FormData },
            onSuccess : function (jqXHR) { 
alert('addp oncuss');
              jqXHRFromOnSuccess=jqXHR;
              return true;
              },
            afterSave: function (rowID) {
alert('afeesave addp ');
              cancelEditing($grid);
                  afterDetailSaveFunc(rowID,jqXHRFromOnSuccess);
              jqXHRFromOnSuccess=null; 
              },
            onError: errorfunc,
            afterRestore : setFocusToGrid,
            oneditfunc  : function (rowId) {
              var selRowData, selRowId ;
              if (rowId && rowId !== lastSelectedRow) {
                cancelEditing($grid);
                selRowId = $grid.jqGrid('getGridParam', 'selrow');
                if (selRowId ) {
                   selRowData = $grid.jqGrid('getRowData', selRowId ); 
                   $('#' + rowId + '_Reanr' ).val(selRowData.Reanr); 
                  }
                lastSelectedRow = rowId;
                }
             }
        }
    }
);

Только oneditfunc func называется. Как заставить также вызываться методы onSuccess, afterSave, onError и т. Д.?

Обновление 2

Я добавил патч в jqGrid из github, рекомендованного в ответе, и попытался

$.extend( jQuery.jgrid.inlineEdit, {
  addParams: { 
    position: "beforeSelected", 
    rowID: '<%= EntityBase.NewRowIdPrefix %>',
    useDefValues: true,
    addRowParams: {
      keys: true,
      extraparam: { _dokdata: FormData },
      onSuccess : function (jqXHR) { 
        jqXHRFromOnSuccess=jqXHR;
        return true;
        },
      afterSave: function (rowID) {
              cancelEditing($grid);
              <% if (Model is RowBase ) { %>
                  afterDetailSaveFunc(rowID,jqXHRFromOnSuccess);
                <% } else { %>
                  afterGridSaveFunc(rowID,jqXHRFromOnSuccess);
                <% } %>
              jqXHRFromOnSuccess=null; 
              },
      onError: errorfunc,
      afterRestore : setFocusToGrid,
      oneditfunc : function (rowId) {
        if (rowId && rowId !== lastSelectedRow) {
          cancelEditing($grid);
          lastSelectedRow = rowId;
          }  
        } 
      }
    }
} );

В этом случае ввод не завершает добавление. Все параметры из этого кода игнорируются.

1 ответ

Решение

Вы должны использовать defaultValue свойство editoptions для установки значений по умолчанию для новой добавленной строки. В текущей документации вы можете обнаружить, что опция действительна только в модуле редактирования формы:

Опция может быть строкой или функцией. Эта опция действительна только в модуле редактирования формы при использовании с методом editGridRow в режиме добавления. Если определено, элемент input устанавливается с этим значением, если только элемент пуст. При использовании в тексте должен быть указан текст, а не ключ. Также, когда функция используется, функция должна возвращать значение.

но если вы изучите код нового метода addRow, вы увидите, что

  1. значение по умолчанию useDefValues вариант true
  2. метод использовать (см. здесь) defaultValue свойство editoptions.

ОБНОВЛЕНО: ОК! Теперь я вижу твою проблему. Вы использовали только неправильные свойства в editRowParams а также addRowParams части настроек. Правильно будет:

$grid.jqGrid('inlineNav', topPagerSelector, {
    addParams: {
        position: "beforeSelected", 
        rowID: '_empty',
        useDefValues: true,
        addRowParams: {
            keys: true,
            oneditfunc :  onInlineEdit
        }
    },
    editParams: {
        keys: true,
        oneditfunc: onInlineEdit
    },
   add: true,
   edit: false,
   save: true,
   cancel: true
});

Кроме того, вы можете использовать новую функцию $.jgrid.inlineEdit для установки keys, oneditfunc или другие параметры встроенного редактирования. Реализация этой функции не является полностью корректной, но вы можете просмотреть текущую версию с github (см. Здесь) и сделать то же изменение в вашей версии jquery.jqGrid.src.js, В любом случае я бы рекомендовал использовать функцию $.jgrid.inlineEdit после публикации следующей версии jqGrid. Преимущество заключается в том, что вы можете легко установить параметры editRow независимо от того, где функция будет вызываться (из inlineNav, 'actions' форматтер или любой другой способ).

новый jqGridInlineEditRow Функция события (см. здесь для получения дополнительной информации) позволит вам выполнять действия, такие как то, что вы делаете сейчас внутри onInlineEdit событие без использования oneditfunc который может быть установлен только один раз.

Другие вопросы по тегам