2016-11-18 108 views
0

Here is the image of the UI我在这里在asp.net初学者,我希望能问,如果你们知道如何解决我的问题。我有一个删除按钮,删除我的datagridview中选中的复选框。每次运行代码时,它都会给出在int id = Convert.ToInt32(brandgrid.DataKeys[row.RowIndex].Values[0]);代码中超出范围错误的参数(索引超出范围)?ASP.NET GridView的DataKeys错误 - 参数超出范围的指数超出范围

  foreach (GridViewRow row in brandgrid.Rows) 
      { 

       int id = Convert.ToInt32(brandgrid.DataKeys[row.RowIndex].Values[0]); 

       CheckBox chkdel = (CheckBox)row.FindControl("chkDel"); 
       if(chkdel.Checked) 
        { 
         //int id = Convert.ToInt32(row.Cells[0].Text); 
         SqlCommand cmd = new SqlCommand(); 
         cmd.CommandType = CommandType.StoredProcedure; 
         cmd.CommandText = "usp_Brand_Delete"; 
         cmd.Parameters.AddWithValue("@login", current); 
         cmd.Parameters.AddWithValue("@id", id); 
         cmd.Connection = sqlCon; 

         sqlCon.Open(); 
         cmd.ExecuteNonQuery(); 
         sqlCon.Close(); 
        } 
      } 

     } 
+0

你可以发布你的'GridView'在aspx页面? – Aruna

+0

Jetlag

+0

贵GridView的第一填补?你是否偶然检查过没有列。你调试了吗?这段代码执行前的行数和列数是多少? –

回答

0

好了,从下面的GridView,它的确认,您没有设置DataKeyNames属性在GridView等,其如你上面所说的引发错误。

<asp:GridView ID="brandgrid" runat="server" GridLines="None" AllowPaging="True" CssClass="mGrid" ShowHeaderWhenEmpty="True" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" DataSourceID="SqlDataSource1"> 
    <AlternatingRowStyle CssClass="alt"></AlternatingRowStyle> 
    <PagerStyle CssClass="pgr"> 
    </PagerStyle> 
</asp:GridView> 

从MSDN,

当DataKeyNames属性被设置时,GridView控制 自动创建用于控制每一行DataKey对象。 的DataKey对象包含在DataKeyNames属性中指定的一个或多个字段 的值。然后将DataKey对象添加到控件的DataKeys集合中,即 。使用DataKeys属性 检索特定数据行的DataKey对象在GridView 控制。

要访问此属性,您必须在GridView中设置DataKeyNames="<ID column name>"

我在GridView中添加了DataKeyNames="id"属性,假设列名为ID,但您必须检查并更改此属性。

<asp:GridView ID="brandgrid" runat="server" DataKeyNames="id" GridLines="None" AllowPaging="True" CssClass="mGrid" ShowHeaderWhenEmpty="True" PagerStyle-CssClass="pgr" AlternatingRowStyle-CssClass="alt" DataSourceID="SqlDataSource1"> 
    <AlternatingRowStyle CssClass="alt"></AlternatingRowStyle> 
    <PagerStyle CssClass="pgr"> 
    </PagerStyle> 
</asp:GridView> 

也改变如下代码,

foreach (GridViewRow row in brandgrid.Rows) 
{ 
    if(row.RowType == DataControlRowType.DataRow) 
    { 
      var dataKey = brandgrid.DataKeys[row.RowIndex].Value; 
      if(dataKey != null) 
      { 
       int id = (int)dataKey; 

       CheckBox chkdel = (CheckBox)row.FindControl("chkDel"); 
       if(chkdel.Checked) 
        { 
         //int id = Convert.ToInt32(row.Cells[0].Text); 
         SqlCommand cmd = new SqlCommand(); 
         cmd.CommandType = CommandType.StoredProcedure; 
         cmd.CommandText = "usp_Brand_Delete"; 
         cmd.Parameters.AddWithValue("@login", current); 
         cmd.Parameters.AddWithValue("@id", id); 
         cmd.Connection = sqlCon; 

         sqlCon.Open(); 
         cmd.ExecuteNonQuery(); 
         sqlCon.Close(); 
        } 
      } 

     } 
    } 
+0

我忘了编辑,我没有我的数据源,我手动连接它通过代码 – Jetlag

+0

数据源是好的,如果你在代码来处理它。正如我告诉 – Aruna

+0

添加'DataKeyNames'我得到这个:DataBinding:'System.Data.DataRowView'不包含名称为'id'的属性。 – Jetlag