2012-04-21 65 views
2

我在jqGrid的首发,我想实现的jqGrid删除肌动蛋白我写此代码为填充的jqGrid执行删除的jqGrid

$(function() { 
    var grid = $('#list'); 
    grid.jqGrid({ 
     url: 'jQGridHandler.ashx', 
     postData: { ActionPage: 'TransportType', Action: 'Fill' }, 
     ajaxGridOptions: { cache: false }, 
     loadonce: true, 
     direction: "rtl", 
     datatype: 'json', 
     height: 490, 
     colNames: ['Code', 'TransportType', 'TransportTypeAbbr', 'Remark'], 
     colModel: [ 
      { name: 'TRANSPORT_ID', width: 100, sortable: true, editable: true }, 
      { name: 'TRANSPORT_NAME', width: 200, sortable: true, editable: true }, 
      { name: 'TRANSPORT_ABBR', width: 100, sortable: true, editable: true }, 
      { name: 'REMARK', width: 100, sortable: true, editable: true } 
     ], 
     gridview: true, 
     rowNum: 20, 
     rowList: [20, 40, 60], 
     pager: '#pager', 
     sortname: 'TRANSPORT_ID', 
     viewrecords: true, 
     sortorder: 'ASC', 
     caption: '', 
     rownumbers: true 
    }); 
    grid.jqGrid('navGrid', '#pager', { add: true, edit: true, del: true }, 
    { height: 300, width: 300, url: "JQGridHandler.ashx?ActionPage=TransportType&Action=Update", reloadAfterSubmit: false }, 
    { height: 400, width: 500, url: "JQGridHandler.ashx?ActionPage=TransportType&Action=Insert", reloadAfterSubmit: false }, 
    { url: "JQGridHandler.ashx?ActionPage=TransportType&Action=Delete", reloadAfterSubmit: false }, 
    { multipleSearch: true, overlay: false, width: 460 }); 

和jQGridHandler我写这篇文章的代码

case "TransportType": 
    var transport = new TransportTypesBusiness(); 
    TRANSPORT_TYPES transportItem; 
    switch (request.QueryString["Action"]) 
    { 
     case "Fill": 
      string numberOfRows = request["rows"]; 
      string pageIndex = request["page"]; 
      int totalRecords = 0; 
      output = transport.BuildJQGridResults(Int32.Parse(numberOfRows), Int32.Parse(pageIndex), totalRecords); 
      response.Write(output); 
      break; 
     case "FillDrop": 
      output = transport.BuildJQGridResults(); 
      response.Write(output); 
      break; 
     case "Insert": 
      transportItem = new TRANSPORT_TYPES { 
       TRANSPORT_NAME = request["TRANSPORT_NAME"].ToString(), 
       TRANSPORT_ABBR = request["TRANSPORT_ABBR"].ToString(), 
       REMARK = request["REMARK"].ToString() 
      }; 
      bool isInsert = transport.AddNew(transportItem); 
      break; 
     case "Update": 
      transportItem = new TRANSPORT_TYPES { 
       TRANSPORT_ID = int.Parse(request["TRANSPORT_ID"].ToString()), 
       TRANSPORT_NAME = request["TRANSPORT_NAME"].ToString(), 
       TRANSPORT_ABBR = request["TRANSPORT_ABBR"].ToString(), 
       REMARK = request["REMARK"].ToString() 
      }; 
      bool isUpdate = transport.Update(transportItem); 
      break; 
     case "Delete": 
      bool isDelete = 
       transport.Delete(
        transport.Find(c => c.TRANSPORT_ID == int.Parse(request["TRANSPORT_ID"].ToString()))); 
      break; 
    } 

当我删除了一条记录,我无法获得request["TRANSPORT_ID"].ToString()的值。

请帮帮我。感谢所有

编辑1: 我从这个

$(function() { 
      var grid = $('#list'); 
      grid.jqGrid({ 
       url: 'jQGridHandler.ashx', 
       postData: { ActionPage: 'TransportType', Action: 'Fill' }, 
       ajaxGridOptions: { cache: false }, 
       loadonce: true, 
       direction: "rtl", 
       datatype: 'json', 
       height: 490, 
       colNames: ['Code', 'TransportType', 'TransportTypeAbbr', 'Remark'], 
       colModel: [ 
         { name: 'TRANSPORT_ID', key: true,,hidden:true, editable:false }, 
         { name: 'TRANSPORT_NAME', width: 200, sortable: true, editable: true }, 
         { name: 'TRANSPORT_ABBR', width: 100, sortable: true, editable: true }, 
         { name: 'REMARK', width: 100, sortable: true, editable: true } 
         ], 
          cmTemplate: { width: 100, editable: true }, 
       prmNames: { oper: 'Action', editoper: 'Update', addoper: 'Insert', 
        deloper: 'Delete', id: 'STATUS_ID' 
       }, 
       gridview: true, 
       rowNum: 20, 
       rowList: [20, 40, 60], 
       pager: '#pager', 
       sortname: 'TRANSPORT_ID', 
       viewrecords: true, 
       sortorder: 'ASC', 
       caption: '', 
       rownumbers: true 
      }); 
      $.extend($.jgrid.edit, { 
       editData: { ActionPage: 'StatusType' }, 
       savekey: [true, 13], 
       closeOnEscape: true, 
       closeAfterEdit: true, 
       closeAfterAdd: true, 
       reloadAfterSubmit: false, 
       recreateForm: true 
      }); 

      grid.jqGrid('navGrid', '#pager', { add: true, edit: true, del: true }, 
        { height: 300, width: 300 }, 
        { height: 400, width: 500 }, 
        {}, 
        { width: 460 }); 

,并在处理程序编辑脚本得到

ActionPage 写这段代码

HttpRequest request = context.Request; 
     string ss = request["ActionPage"].ToString(); 

电网第一负载数据,但点击编辑按钮时得到错误。

回答

3

我想你的问题的由来是你填写网格rowid不正确。可能你会正确地填充网格行的id,但是不要使用这些信息。

顺便说一句,您使用Action参数的值为"Insert","Update""Delete"。另一方面,已经有标准参数oper,这些参数将在行编辑过程中发送到服务器(请参阅here)。 oper参数的值将是“add”,“edit”和“del”。所以我认为在编辑过程中不需要使用额外的Action参数。我建议你只需要测试oper参数的值。

如果你喜欢有另一个名字和oper参数的值,你可以使用的jqGrid的prmNames选项可以更改默认设置:

prmNames: { oper: "Action", editoper: "Update", addoper: "Insert", deloper: "Delete" } 

我没有看到的ActionPage=TransportType附加参数使用任何意义你在所有的网址中使用。如果您确实需要分享相同的网址"jQGridHandler.ashx"以达到其他目的,您可以使用editurl: "jQGridHandler.ashx"并将ActionPage=TransportType部分添加到使用postData,editDatadelData参数的网址。

以与oper参数相同的方式,在编辑操作期间,将会向服务器发送一个名称为id的更多参数。所以你可以在服务器端使用request["TRANSPORT_ID"]。如果您更喜欢另一个名称(我没有看到它真的需要),您可以在prmNames中添加id: "TRANSPORT_ID"属性。它会解决你的主要问题。

所以,如果你不想做任何修改,你可以做服务器代码在客户端

$(function() { 
    var grid = $('#list'); 
    grid.jqGrid({ 
     url: 'jQGridHandler.ashx', 
     editurl: 'jQGridHandler.ashx', 
     postData: { ActionPage: 'TransportType', Action: 'Fill' }, 
     loadonce: true, 
     direction: "rtl", 
     datatype: 'json', 
     height: "auto", 
     colNames: ['Code', 'TransportType', 'TransportTypeAbbr', 'Remark'], 
     colModel: [ 
      { name: 'TRANSPORT_ID', key: true }, 
      { name: 'TRANSPORT_NAME', width: 200 }, 
      { name: 'TRANSPORT_ABBR' }, 
      { name: 'REMARK' } 
     ], 
     cmTemplate: {width: 100, editable: true}, 
     prmNames: { oper: 'Action', editoper: 'Update', addoper: 'Insert', 
      deloper: 'Delete', id: 'TRANSPORT_ID' 
     }, 
     gridview: true, 
     rowNum: 20, 
     rowList: [20, 40, 60], 
     pager: '#pager', 
     sortname: 'TRANSPORT_ID', 
     viewrecords: true, 
     sortorder: 'ASC', 
     rownumbers: true 
    }); 
    $.extend($.jgrid.edit, { 
     editData: { ActionPage: 'TransportType' }, 
     savekey: [true, 13], 
     closeOnEscape: true, 
     closeAfterEdit: true, 
     closeAfterAdd: true, 
     reloadAfterSubmit: false, 
     recreateForm: true 
    }); 
    $.extend($.jgrid.del, { 
     delData: { ActionPage: 'TransportType', Action: 'Delete' }, 
     reloadAfterSubmit: false, 
     closeOnEscape: true 
    }); 
    $.extend($.jgrid.search, { 
     multipleSearch: true, 
     recreateFilter: true, 
     overlay: false 
    }); 
    grid.jqGrid('navGrid', '#pager', {}, 
     { height: 300, width: 300, editData: { ActionPage: 'TransportType', Action: 'Update' } }, 
     { height: 400, width: 500, editData: { ActionPage: 'TransportType', Action: 'Insert' }, 
      afterSubmit: function (response) { 
       return [true, '', response.responseText]; 
      }}, 
     {}, 
     { width: 460 } 
    ); 
}); 

下面我增加了一些额外的设置和使用cmTemplate更改默认值(见here)为colModel项目。

您的代码中出现问题的一个更重要的事情。您使用reloadAfterSubmit: false设置。如果在"Insert"操作的服务器响应中返回id对新创建的项目很重要。所以使用应该使用response.Write(output);来写入服务器响应身份的id。此外,您需要使用afterSubmit(见the answer)从服务器响应得到新的ID,并转发给jqGrid的:

grid.jqGrid('navGrid', '#pager', {}, 
    { height: 300, width: 300, editData: {ActionPage: 'TransportType', Action: 'Update'} }, 
    { height: 400, width: 500, editData: {ActionPage: 'TransportType', Action: 'Insert'}, 
     afterSubmit: function (response) { 
      return [true, '', response.responseText]; 
     }}, 
    {}, 
    { width: 460 } 
); 

修订:您可以从here下载演示项目。

+2

@ Oleg:谢谢帮助我,但$ .expand不是函数,并获取undifine错误,您的意思是$ .extend函数?。请帮助我 – Pouya 2012-04-22 11:24:50

+1

@MohsenBahrzadeh:不客气!你对[$ .extend]是正确的(http://api.jquery.com/jQuery.extend/)。我只是将代码编写在一起,其余的答案都是这样,所以它可能包含一些输入错误。我会在我的答案中将'$ .expand'修复为'$ .extend'。另一件我忘了写给你的东西:如果你使用'key:true',你可以在服务器响应中发送更紧凑的数据。所以你不需要发送两次'TRANSPORT_ID'的值。你应该使用相应的'jsonReader'。 – Oleg 2012-04-22 11:37:15

+0

@ oleg:谢谢但在服务器端需要给ActionPage值得到错误,ActionPage是undifine,请帮助我。谢谢 – Pouya 2012-04-29 09:57:06