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