我有asp.net web应用程序,我需要删除与PostgreSQL一起工作的GridView1中的行。我需要删除行,但不必使用ObjectDataSource。下面是我的GridView1_RowDeleting方法:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int ID2 = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]);
string constr = ConfigurationManager.ConnectionStrings["postgresConnectionString"].ConnectionString;
using (NpgsqlConnection cn = new NpgsqlConnection(constr))
{
string query = "DELETE FROM mainpage WHERE id=@ID";
NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
cmd.Parameters.Add("@ID2", NpgsqlDbType.Integer).Value = ID2;
cn.Open();
cmd.ExecuteNonQuery();
} 下面是我在.aspx文件中的.aspx文件:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" Width="1650px" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting" >每次单击delete按钮,都会出现错误:"Index超出范围。索引必须是正数,其大小不应超过集合的大小。参数名称: index“。我觉得我的int Id有问题。我试过的是:
int ID = (int)GridView1.DataKeys[e.RowIndex].Value;
string ID = GridView1.DataKeys[e.RowIndex].Value.ToString(); and much more...发布于 2018-09-07 08:59:41
我认为出现ArgumentOutOfRangeException是因为您没有在网格上设置DataKeyNames属性属性,因此在调用e.RowIndex时行索引仍然超出范围。您应该将其设置为ID/主键列名,如下所示:
DataKeyNames="[ID or PK column name]"下面是一个示例用法:
<asp:GridView ID="GridView1" runat="server" DataKeyNames="id"
AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None"
Width="1650px" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting">
</asp:GridView>更新1
此外,我在此查询中发现参数名称不匹配:
string query = "DELETE FROM mainpage WHERE id=@ID";
NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
cmd.Parameters.Add("@ID2", NpgsqlDbType.Integer).Value = ID2;正确的例子应该如下所示:
string query = "DELETE FROM mainpage WHERE id=@ID";
NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
cmd.Parameters.Add("@ID", NpgsqlDbType.Integer).Value = ID2;https://stackoverflow.com/questions/52218575
复制相似问题