【问题标题】:Passing extra parameters in JQGrid delete with multiselect使用多选在 JQGrid 中传递额外参数删除
【发布时间】:2013-07-21 07:59:41
【问题描述】:

我想在我的 JQGrid 中有删除功能来删除多行。我的代码如下所示:

    {height:180,mtype:"POST",closeAfterDel:true, url:'gridedit.jsp',reloadAfterSubmit:true,

 onclickSubmit: function (options, rowid) {
      var rowData = jQuery(this).jqGrid('getRowData', rowid);
      var params ={amount:rowData.amount,account:rowData.account.replace(/-/g,"")};

      return params;

   },

   afterSubmit: function () {
    $(this).jqGrid('setGridParam', {datatype:'json'});
    return [true,'']; 
}

}

我想根据列 rowData.account

的值进行删除

问题是,当我选择多行时,我可以看到网格将所有rowid的返回到编辑URL,但只传递了第一行的rowData.account值!

有没有办法让网格传回所有的值?我无法根据后端的行 ID 删除,因为我的数据库没有任何行 ID。

请帮忙。

这是我的网格代码:

    jQuery(document).ready(function(){ 

  jQuery("#list").jqGrid({

  datatype: 'json',
  url:'gridfeeder.jsp?ctlSelectedDate=<%= request.getParameter("ctlSelectedDate")%>',

  colNames: ['Date', 'Account ', 'Amount', 'Code'],
  colModel: [

             //First Column, DATE

  {name: 'adate', index: 'adate', width: 300, sorttype: 'date', align: 'center',datefmt: 'Y-m-d',
 editable:true, formatter: myLinkFormatter, editoptions:{

     dataInit:function(elem)
      {
     jQuery(elem).datepicker({

         showButtonPanel: true,
         changeMonth: true,
          changeYear: true

     });
}}, search:true, stype:'text',searchoptions:{

     dataInit:function(elem)
      {
     jQuery(elem).datepicker({

         showButtonPanel: true,
         changeMonth: true,
          changeYear: true

     });
}

 }

  },
            //Second Column, ACCOUNT

            { name: 'account', index: 'account', width: 300, align: 'center', sorttype: 'string', editable:true,
    search:true, stype:'text',editrules:{custom:true, custom_func:

        //Validation for this column for editing

        function(value, colname) {
        if (value.length<9 || value.length>11) 
               return [false,"Invalid Input"];
            else 
               return [true,""];
            }
    },
    searchrules:{custom:true, custom_func:

//对该列进行搜索验证

        function(val, colname) {
        if (val.length<9 || val.length>11) 
               return [false,"Invalid Input"];
            else 
               return [true,""];
            }
    }
  },

            //Third Column, AMOUNT

  { name: 'amount', index: 'amount', width: 300, align: 'center', sorttype: 'float', editable:true,
    editrules:{number:true}, search:true, stype:'text'
  },

            //Fourth Column, CODE

  { name: 'code', index: 'code', width: 300, align: 'center', sorttype: 'float', editable:true,
    search:true, stype:'text'
  }

  ],

  pager: "#pager",      //Identifying the navigation bar
  rowNum: 500,          // how many rows to display on page 1
  rowList: [500,1000, 2000, 3000,4000], //values for the dropdown which specifies how many rows to show 
  sortorder: "desc", //the order of sorting by default
  viewrecords: true, // displays total number of rows
  gridview: true,
  autoencode: true,
  height:400, //height of the grid
  ignoreCase:true,// case insensitive search
  multiselect:true, // checkboxes before each row
  multiboxonly: true,
  loadonce:true, //for client side sorting, searching and pagination
  caption:"This is me" // caption for the grid header

这里是导航栏部分:

    }).navGrid('#pager',{edit:true,add:true,del:true,search:true,refresh:true},

// Options for EDIT 

    {height:280,mtype: "POST",closeAfterEdit: true,reloadAfterSubmit:true, url:'gridedit.jsp',

        recreateForm: true, 

        //set some properties beofre the dialog box is seen by the user

        beforeShowForm: function(form) {

            /*$('#adate',form).attr('readonly','readonly');
            $('#account',form).attr('readonly','readonly');*/

            $('#adate',form).hide();
            $('#account',form).hide();
        },

        // what happens when the user clicks submit. passing extra parameters

           onclickSubmit: function (options, postdata) {

               var rowid = postdata[this.id + "_id"]; // postdata.list_id

               var dataF = jQuery('#list').jqGrid ('getCell', rowid, 'account');

            return {account:dataF.replace(/-/g,"")};
            },

           // changing the datatype

         afterSubmit: function () {
            $(this).jqGrid("setGridParam", {datatype: 'json'});
            return [true,''];
        }

    },

    //ADD options

    {height:280,mtype:"POST", closeAfterAdd:true, reloadAfterSubmit:true, url:'gridedit.jsp',


beforeShowForm: function(form) {

    /*var cm = jQuery("#list").jqGrid('getColProp','adate');
    alert(cm);
    cm.editable = false;
    $('#adate',form).attr('readonly','readonly');
    $('#account',form).attr('readonly','readonly');*/
    $('#adate',form).show();
    $('#account',form).show();
},

    //Change the datatype

afterSubmit: function () {
    $(this).jqGrid("setGridParam", {datatype: 'json'});
    return [true, ""];
}
    },

    {height:180,mtype:"POST",closeAfterDel:true, url:'gridedit.jsp',reloadAfterSubmit:true,

/* onclickSubmit: function (options, rowid) {
      var rowData = jQuery(this).jqGrid('getRowData', rowid);
      var params ={account:rowData.account.replace(/-/g,"")};

      return params;

   },*/

   delData: {
       account: function() {
                  var sel_id = $("#list").jqGrid('getGridParam', 'selrow');
                  var value = $("#list").jqGrid('getCell', sel_id, 'account');
                  return value.replace(/-/g,"");
             }
      },
   afterSubmit: function () {
    $(this).jqGrid('setGridParam', {datatype:'json'});
    return [true,'']; 
}

    }

    );

  function myLinkFormatter(cellvalue, options, rowObject) {

      return "<a href='account094act.jsp?GETDATE=" + cellvalue + "&GETACC=" + rowObject[1] + "'>" + cellvalue + "</a>";
  }

  jQuery("#refresh_list").click(function(){
        jQuery("#list").setGridParam({datatype: 'json'});
        jQuery("#list").trigger("reloadGrid");
    });

    });  

【问题讨论】:

    标签: jqgrid multi-select


    【解决方案1】:

    一个使用最适合您的情况的唯一值作为 rowids。也许您应该考虑使用来自account 列的值作为rowid?您没有发布您自己的 jqGrid 的完整代码,也没有发布用于填充网格的 JSON/XML 数据。所以很难给你一个准确的建议。

    您可以考虑在account 列的定义中将key: true 属性放在colModel 中。如果列中的所有值都是唯一的(网格的所有行中的值都不同),那么您可以使用这些设置。在这种情况下,rowid(网格的&lt;tr&gt; 元素的id 属性的值)将被分配与account 列中的值相同的值。

    所有编辑操作都会发送编辑行的id。所以你会得到account 发送到服务器。在multiselect: true jqGrid 的情况下发送逗号分隔的rowid 列表。在您的情况下,您将获得服务器逗号分隔的已删除帐户列表。如果需要,您可能可以根据account 值获取所有其他信息(如amount)。如果account 值确实是唯一的,并且您在服务器上拥有所有数据,那么您可以获得与所选account 相对应的任何信息。

    【讨论】:

    • 您好,感谢您的回复。我正在使用 JSON 数据。现在,当我在选择多行后单击删除按钮时,什么也没有发生!根本没有数据发送到服务器。我很确定它应该至少发送所有行的 id。我做过一次,很久以前,但我现在不记得了。
    • 你能看到我遗漏的任何东西吗?有什么我需要指定的,以便删除按钮适用于多项选择吗?
    • 很明显,您应该在delData.account 中获得selarrrow 数组而不是selrow 选项。如果真的什么都不会发送到服务器(没有帖子到gridedit.jsp),那么您可以调试代码。您可以在delData.account 内部和$("#dData","#"+dtbl+"_2").click(function(){ 下面的行上设置断点。我希望你已经使用 jquery.jqGrid.src.js 而不是 jquery.jqGrid.min.js 并且很容易找到所需的 jqGrid 代码行。
    • 嗨,奥列格,我做了一些小改动。我将 key:true 放在我的帐户列中,现在我得到一个逗号分隔的帐号列表,该列表被传递到后端。这大大简化了我的问题,因为我不再需要明确发送帐号。唯一的问题是当我尝试使用 String[] k=request.getParameter("id"); 访问这个数组的元素时;它显示一个错误,说类型不匹配。当我做 String k=request.getParameter("id");那么没有错误,但我只能访问发送的最后一个元素。
    • 如何访问后端的整个数组?
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多