2014-02-18 29 views
1
刪除列

我收到錯誤,如指數超出範圍的異常,而從GridView控件

「索引超出範圍。必須大於尺寸的集合 非負少」

當試圖刪除gridview的行。我的aspx.cs代碼如下:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    try 
    { 
     main delete=new main(); 

     // int id = Convert.ToInt32(GridView1.Rows[e.RowIndex].Cells["id"].Value); 
     // string ID = GridView1.Rows[e.RowIndex].ToString(); 
     sQLcONN.Open(); 
     string Query = "delete * from shoppingcart where shoppingcart.with_puja = '"+Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString())+"' "; 
     delete.deleteData(Query); 
     Bindgrid(); 
     sQLcONN.Close(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("{0} Exception caught.", ex); 
    } 
} 
+1

檢查e.RowIndex的值,它必須是錯的 – Cris

+0

您確實需要先排序代碼格式和命名。 – nik0lias

回答

1

也許DataKeys部分是罪魁禍首,它必須是這樣的:

string Query = "delete from shoppingcart where shoppingcart.with_puja = '" + Convert.ToInt32(e.Item.DataKeys["nameOfKey"].Value).ToString() + "'"; 

或者是這樣的:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    try 
    { 
     main delete = new main(); 
     DataTable dt = GridView1.DataSource as DataTatable; 

     sQLcONN.Open(); 
     string Query = "delete from shoppingcart where shoppingcart.with_puja = '" + Convert.ToInt32(dt.Rows[e.RowIndex]["nameOfKey"]).ToString() + "'"; 
     delete.deleteData(Query); 
     Bindgrid(); 
     sQLcONN.Close(); 

    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("{0} Exception caught.", ex); 
    } 
} 

哪裏nameOfKey是這是with_puja表的列名在你的情況和GridView1必須是e.Item如果eItem財產。

+0

我得到一個錯誤,因爲Gridview不包含Item的定義。 – user3247426

+0

就像我說的,用'e.Item'代替'GridView1' –

+0

nop我無法解決我的問題。 – user3247426

0

您可以傳遞行索引作爲CommandArgument。

在服務器上的情況下方法:

int rowIndex = int.Parse(e.CommandArgument.ToString()); 
string val = (string)this.grid.DataKeys[rowIndex]["myKey"]; 

在按鈕使用:

CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' 

編輯:

查詢:

string Query = "delete * from shoppingcart where shoppingcart.with_puja = '"+val +"' "; 

我建議使用參數來避免sql injections

+0

查詢書房將如何? – user3247426

+0

你只需用val代替你在那裏,我更新了答案 –

1

DataKeysGridView會是這樣:

DataKeyNames="Id, foo, foo" 

,然後嘗試使用字符串像這樣:

Convert.ToInt32(GridView1.DataKeys[e.RowIndex][0].ToString()); // 0 is the index and in this case Id will be at zero 
0

試試這個

string Query = "delete * from shoppingcart where shoppingcart.with_puja = '" + Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values["Id"].ToString()) + "'"; 
0

總和+ = Convert.ToInt32 (GridView1.Rows [I] .Cells [3]。文本);

+0

你可以通過解釋這將如何幫助改善你的答案。 – dakab

1

好的,這個問題讓我感到煩惱,但是直到今天才發現它。

我的情況:

  • 數據庫的新手。

  • 建立我自己的數據庫。

  • 使用ASP。NET與MySQL,phpMyAdmin

  • 出於某種原因,我的表中只有一個有這個問題。


在尋找解決的辦法,我決定開我的數據庫,並從的MyISAM更改違規表的存儲引擎InnoDB的

而這一點就解決了這個問題。

但這只是線索至於真正的問題。在我的情況下,違規表格更加繁重,只是偶爾改變,所以MyISAM就是我想要的。

這裏的關鍵區別是MyISAM輸入更嚴格。正如你在上面看到的,有很多Int32轉換正在進行。所以,試試這個:

  • 打開你的數據庫,表
  • 檢查表的id字段
  • 是同類型某種形式的「內部」
  • 的超過32個其他值/長度字段什麼?

希望能爲別人節省一些時間和悲傷。