从GridView中删除行时索引超出范围异常

时间:2014-02-18 07:42:24

标签: c# asp.net 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);
    }
}

6 个答案:

答案 0 :(得分: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_pujaGridView1必须为e.Item,如果eItem属性。

答案 1 :(得分:1)

DataKeys中的GridView就像:

 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

答案 2 :(得分:1)

好吧,这个问题让Bejebus不在我身边,但直到今天才弄明白。

我的情况:

  • 数据库新手。

  • 设置我自己的数据库。

  • 将ASP.NET与MySQL一起使用,phpMyAdmin

  • 出于某种原因,我的桌子中只有一个有这个问题。

在搜索解决方案时,我决定打开我的数据库并将违规表的存储引擎从 MyISAM更改为InnoDB

仅此一点就解决了这个问题。

但对于真正的问题,这只是一个线索。就我而言,有问题的表格读得更重,只是偶尔改变,所以MyISAM就是我想要的。

关键区别是MyISAM对输入更严格。正如您在上面所看到的,有很多Int32转换正在进行中。所以,试试这个:

  • 打开您的数据库,表格
  • 检查表格的id字段
  • 它的类型是某种形式的“Int”
  • 值/长度字段是否为32以外的其他字段?

希望能为他人节省一些时间和悲伤。

答案 3 :(得分: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

答案 4 :(得分:0)

试试这个

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

答案 5 :(得分:0)

sum + = Convert.ToInt32(GridView1.Rows [i] .Cells [3] .Text);