ASP.NET GridView DataKeys错误 - 超出范围索引的参数超出范围

时间:2016-11-18 02:39:47

标签: asp.net

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

            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();
                     }
            } 

        }

2 个答案:

答案 0 :(得分:0)

好的,从下面的GridView开始,确认您没有在GridView中设置DataKeyNames属性,因此,如上所述,它会抛出错误。

<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属性   检索GridView中特定数据行的DataKey对象   控制。

要访问此属性,您必须在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();
                     }
           }

      }
  }

答案 1 :(得分:0)

尝试一下。

GridView.DataKeys[Convert.ToInt32(e.CommandArgument) % GridView.PageSize].Value.ToString();