【问题标题】:How to set default values if row is added using inline add button in jqgrid如果使用 jqgrid 中的内联添加按钮添加行,如何设置默认值
【发布时间】:2012-01-15 19:59:16
【问题描述】:

如果使用表单添加行,下面的代码会设置新行的默认值。 如果使用工具栏中的 jqGrid 内联添加按钮添加行,则不会调用这些方法并且 未设置默认值。

如何强制内联添加执行与以下代码相同的逻辑?

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 函数。如何强制 onSuccess、afterSave、onError 等方法也被调用?

更新 2

我从答案中推荐的 github 向 jqGrid 添加了补丁并尝试过

$.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;
          }  
        } 
      }
    }
} );

我这种情况下输入不会终止内联添加。此代码中的所有参数都将被忽略。

【问题讨论】:

    标签: javascript jquery jquery-ui jqgrid


    【解决方案1】:

    您应该使用editoptionsdefaultValue 属性为新添加的行设置默认值。在当前文档中,您可以发现该选项仅在表单编辑模块中有效:

    选项可以是字符串或函数。此选项仅在 在添加模式下与 editGridRow 方法一起使用时的表单编辑模块。如果 定义了输入元素设置为这个值,如果只有元素 空的。如果在选择中使用,则应提供文本而不是键。 此外,当使用函数时,函数应该返回值。

    但是如果你检查新的addRow 方法的代码你会看到

    1. useDefValues 选项的默认值为true
    2. 该方法使用(参见hereeditoptionsdefaultValue 属性。

    更新:好的!现在我看到了你的问题。您在设置的editRowParamsaddRowParams 部分中使用了错误的属性。正确的是:

    $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 功能来设置keysoneditfunc 或其他内联编辑参数。该功能的实现并不完全正确,但您可以从 github 检查当前版本(参见here)并在您的jquery.jqGrid.src.js 版本中进行相同的修改。无论如何,我建议在发布 jqGrid 的下一个版本后使用$.jgrid.inlineEdit 功能。优点是您可以轻松地设置editRow 的选项,而与调用函数的位置无关(来自inlineNav'actions' 格式化程序或任何其他方式)。

    新的jqGridInlineEditRow 事件功能(请参阅here 了解更多信息)将允许您执行您现在在onInlineEdit 事件中执行的操作无需使用oneditfunc只能设置一次。

    【讨论】:

    • 非常感谢。有问题的代码从当前行检索默认值,如果未设置当前行,则不允许添加行。如何使用 defaultValue 实现这一点?
    • @Andrus:正是代码做不同的事情。 $('#' + 'Recordtype' + '.FormElement').val('Veerg');$('#' + 'Nait2' + '.FormElement')[0].checked = true; 之类的行是纯默认值设置。由于其他设置,我不明白您为什么不在 onEdit 处理程序中进行设置(在您的情况下是 onInlineEdit 函数)?
    • @Andrus:我不确定我是否理解您的问题。当前行的id是onInlineEdit的参数。编辑行中控件(textbox、chechbox、select 等)的 id 规则为rowid + '_' + colName,如123_Recordtype。您可以像在afterShowForm 中设置值一样设置控件中的值。我不明白为什么您需要手动设置输入字段的值(例如$('#' + 'Baas' + '.FormElement').val(selRowData.Baas)),因为内联编辑已经这样做了。
    • @Andrus:好的!我现在看到您使用了错误的参数。我用 UPDATED 部分附加了我的答案。
    • @Andrus:你只是使用了错误的参数名称。你从哪里得到名字:onSuccessafterSaveonErrorafterRestore?在editRow 的文档中,您可以找到editparameters 的属性keysoneditfuncsuccessfuncurlextraparamaftersavefuncerrorfunc、@9876543676@3、 mtype。您应该只使用名称。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多