2012-05-14 56 views
0

我一直在網上尋找答案,也許這是一個比我預期的更復雜(或者我只是不明白解決方案)的情況,但我正在尋找通過單擊垃圾桶圖標簡單地從我的jqgrid中刪除選定的行。簡單的jqgrid在MVC中刪除

目前我的網格正在用Linq填充SQL數據。 這裏是我的網格:

jQuery("#grid").jqGrid({ 
        url: '<%= ResolveUrl("~/Home/GetData") %>', 
        datatype: "json", 
        mtype: 'GET', 
        postData: { DDLid: function() { return jQuery("#DDL option:selected").val(); } }, 
        colNames: ['Col1', 'Col2'], 
        colModel: [ 
         { name: 'Col1', index: 'Col1', width: 200, editable: false }, 
         { name: 'Col2', index: 'Col2', width: 200, editable: false } 
         ], 
        jsonReader: { 
         repeatitems: false 
        }, 
        rowNum: 10, 
        pager: jQuery('#gridpager'), 
        sortname: 'Type', 
        viewrecords: true, 
        sortorder: "asc", 
        caption: "Table" 
       }).navGrid('#gridpager', { del: true, add: false, edit: false, search: false }, {}, {}, {url: "Delete"}); 

現在在崗的數據「身份證」不在此表的主鍵 - 我只是需要它來幫助填充網格。 我想得到的是選定的行ID並將其傳遞給Delete方法,但我找不到任何方法來做到這一點。

我試過在postData中使用jQuery("#grid").getGridParam('selrow'),但它總是返回null。

任何幫助將不勝感激。

這裏是我的刪除方法,以供參考:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Delete(int DDLid) 
    { 
     int row = Convert.ToInt32(/*I NEED THIS ID*/); 
     var query = from x in _ctx.DataTable 
        where ((x.id == row)) 
        select x; 
     _ctx.DataTable.DeleteOnSubmit(query.Single()); 
     _ctx.SubmitChanges(); 
     return Json(true); 
    } 

這種方法被稱爲是好的,但我得到了錯誤的ID。我需要選定的行的ID。這會中斷,因爲DDLid返回多行(因爲它用於填充網格)。

我希望這是有道理的。

+0

不應該mtype是POST/DELETE而不是GET? – Sunny

+0

我有這樣的navGrid,並且發生了相同的結果: '。navGrid('#gridpager',{del:true,add:false,edit:false,search:false},{},{},{url:「Delete」,mtype:「POST」,reloadAfterSubmit:true}); ' –

回答

1

我發現了,我會通過選擇指數(後來我才知道我一直在尋找的主鍵,而不是選定的索引,但它是不管的結果相同)

,我需要把它添加到我的navGrid:

{url: "Delete", mtype: "POST", reloadAfterSubmit: true, 
     serializeDelData: function (postdata) { 
         var selectedrowindex = jQuery("#grid").jqGrid('getGridParam', 'selrow'); 
         var dataFromCellByColumnIndex = jQuery('#grid').jqGrid ('getCell', selectedrowindex , 1); 
         return {DDLid: postdata.id, name: dataFromCellByColumnIndex}; 
     } 
}); 

因此,這傳遞一個列值到我的刪除方法還有DDLid,但我可以很容易地交換dataFromCellByColumnIndex與selectedrowindex 。

+0

我之前寫過你在網格中錯誤填充數據ID時問題的由來。如果你追加你的問題的數據(這將足以有一行數據)將從'url:'返回<%= ResolveUrl(「〜/ Home/GetData」)%>'我會告訴你錯誤。服務器返回的數據應該包含'id'。我想你不這樣做。如果「Col2」列包含id(主鍵),則可以解決向列添加「key:true」的問題。在'selectedrowindex'將與'dataFromCellByColumnIndex'相同的情況下。 – Oleg

+0

是的,我仔細看了一下之後才意識到我是一個noob而不是傳遞主鍵。但我不知道'key:true'部分,所以謝謝! 在jqgrid上是否有很好的教程涵蓋了這樣的事情?因爲我一直無法找到他們...... –

0

你應該只實現具有id參數Delete行動:

public JsonResult Delete(string id) { 
    ... 
} 

要引用在JavaScript代碼的行動,我會用'url: <%= Url.Action("Delete") %>'代替url: "Delete"您當前使用。

您可以下載我爲the answer創建的here演示項目。該項目將刪除該行以及您目前不需要的許多其他功能。

+0

我的代碼中的id參數不是我需要刪除該行的參數(它是一個dropdownlist的id)。我已經實現了一個像這樣的刪除操作,並且它工作正常(因爲我之前使用過一個工作的操作) - 唯一的問題是我無法傳入所選行的主鍵。 –

+0

我編輯了我的答案,也包括刪除方法,如果有幫助:) –

+0

@vegetas_angel:您應該在'Delete'操作中使用'id'作爲名稱。 **選擇正式參數的名稱很重要**。 'id'將被初始化爲你需要的值:到行ID。該值將被初始化爲值$(「#grid」)。jqGrid('getGridParam','selrow')'。如果'id'的值不是你想要的那麼就意味着你只能以錯誤的方式填充網格:從<'%= ResolveUrl(「〜/ Home/GetData」)返回的JSON數據% >''沒有'id'或錯誤的地方。 – Oleg

0

您可以使用自己的參數創建另一個內部刪除方法。定義網格之後,您可以詳細定義每個動作。它使用correctid發佈實際刪除,並且原始發佈是張貼假身份證。 JQgrid使用行計數來刪除而不是主鍵。他們可能與最新版本的改變,但是,這個是工作的jqGrid 3.8

jQuery("#ClientGrid").jqGrid('navGrid', '#ClientGridPager', 
{ view: true, edit: true, search: false }, //options 
{height: 240, caption: 'Edit Client', beforeShowForm: hideIDColumn, reloadAfterSubmit: true, mtype: 'POST', url: "/Settings/EditClient", jqModal: false, closeOnEscape: true, bottominfo: "Fields marked with (*) are required" }, // edit options 
{height: 340, caption: 'Add Client', beforeShowForm: hideIDColumn, reloadAfterSubmit: true, mtype: 'POST', url: "/Settings/CreateClient", jqModal: false, closeOnEscape: true, bottominfo: "Fields marked with (*) are required", closeAfterAdd: true }, // add options 
//delete method 
{reloadAfterSubmit: true, beforeSubmit: function (postdata, formid) 
{ 
    var lastselectedID = -1; 
    if (ClientGridrow != null || typeof (ClientGridrow) != "undefined") 
    { 
     lastselectedID = $("#ClientGrid").getCell(ClientGridrow, 'ID_PK'); 
    } 
    //CUSTOME delete to send taskid instead of rowid 
    $.ajax({ type: "POST", url: "/Settings/DeleteClient/?objid=" + lastselectedID, 
     data: "", success: function (response) 
     { 
      $("#ClientGrid").trigger("reloadGrid"); //reloadAfterSubmit: true is not working in Chrome 
     } 
    }); 
    return [true, "Delete failed message"]; 

}, caption: 'Delete Client', datatype: 'local', url: "/Settings/DeleteClient/?objid=-1", jqModal: false, closeOnEscape: true 
}, // del options..we make two posts 
    {closeOnEscape: true }, // search options 
    {height: 230, width: 350, jqModal: false, closeOnEscape: true} // view options 
    );