Asp.net 索引超出范围。必须为非负数且小于集合的大小

Asp.net 索引超出范围。必须为非负数且小于集合的大小,asp.net,sql,Asp.net,Sql,我有一个网格视图,当我单击第2页时,给出的错误在我的sql命令中突出显示,即:SqlCommand cmdShow=new-SqlCommand(“从学生中删除,其中NRIC='”+GridView1.DataKeys[0]。Value+”,conn)并声明错误为:索引超出范围。必须为非负数且小于集合的大小。 参数名称:索引 thsi是我的代码: protected void GridView1_RowDeleted(Object sender, GridViewCommandEventAr

我有一个网格视图,当我单击第2页时,给出的错误在我的sql命令中突出显示,即:
SqlCommand cmdShow=new-SqlCommand(“从学生中删除,其中NRIC='”+GridView1.DataKeys[0]。Value+”,conn)并声明错误为:
索引超出范围。必须为非负数且小于集合的大小。
参数名称:索引

thsi是我的代码:

  protected void GridView1_RowDeleted(Object sender, GridViewCommandEventArgs e)
    {
        SqlConnection conn = new SqlConnection("Data Source=MCDU\\SQLEXPRESS;Initial Catalog=n;Integrated Security=True");

        conn.Open();

        SqlCommand cmdShow = new SqlCommand("delete from Student where NRIC= '" + GridView1.DataKeys[0].Value + "'", conn);

        cmdShow.ExecuteNonQuery();

        conn.Close();

        Response.Redirect("studentParticulars.aspx");
    }

检查
GridView1.DataKeys
是否不是epty。此错误只能由行上的
GridView1.DataKeys[0]
运算符引起。

GridView1.DataKeys
集合中没有项


该错误消息表示您试图在数组集合的边界之外进行访问。只有在
GridView1上才显示您正在为数组或集合编制索引。数据键

检查此项,请始终记住您需要将其作为您的gridview分页

 protected void grdView_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
    grdView.PageIndex = e.NewPageIndex;
    grdView.DataSource = bindgrid();
    grdView.DataBind();  
}
这是示例代码链接


希望这能帮助你()

所以,正如你确认的那样,当你点击
delete
按钮时,行应该被删除。根据GridView标记中的内容,请进行以下更正:

由于您使用SqlDataSource作为GridView的数据源ID,因此此SqlDataSource控件将负责删除功能。这是因为当我们单击“删除”按钮时,GridView将相应地将其传递给
SqlDataSource
,并使用正确的参数。只需将此数据源控件的
Delete
命令设置为:

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthWindEntities %>"  
SelectCommand="Select top 20 ContactName,CompanyName,CustomerID from Customers" 
DeleteCommand="Delete from Customers where CustomerID=@CustomerID" 
UpdateCommand="UPDATE Customers SET ContactName = ContactName,
CompanyName=@CompanyName WHERE CustomerID = @CustomerID" >
</asp:SqlDataSource>
现在,只需确保要删除的行没有使用外键设置任何子行。如果有,则首先删除子行

另外,当您单击任何分页链接时(此处您单击的是第2页),也会调用
onrowcommand
,然后您删除了一行,该行不符合任何逻辑

就这样。在网格视图中单击
delete
按钮后,如果您已为
SqlDataSource
控件正确设置了
delete
命令,它将删除该行

只是重复代码中的错误:

  • 当DataSourceId为
    SqlDataSource
    控件时,您需要设置此datasource控件的
    Delete
    命令。当我们单击Delete按钮时,GridView将相应地使用正确的参数将其传递给
    SqlDataSource

  • onrow命令
    不应用于删除行。

  • 如果希望在删除某行后执行某些代码,请使用
    onrowdelected
    事件

如果您需要更多说明,请告诉我。

我应该在数据键中输入什么而不是0。抱歉,我对所有这些都很陌生。
GridViewCommandEventArgs
包含已删除行的行索引和键值。使用这些值。RowDeleted事件发生在从GridView中删除行之后,因此当您请求一行时,GridView可以为空,这会导致异常。您好,我有两个问题,您的第2页是否包含任何项目?这是在第2页页面加载期间发生的吗?我的数据库中有100多个数据,我将每个数据放在每页15个。但一旦我点击第2页,它就会提示我这个错误。是的,发生在第2页加载。在这种情况下,你需要显示你的分页代码=)我没有分页代码。我只允许这样的分页:您尝试的是单击delete按钮将删除该行?这就是为什么你使用:AutoGenerateDeleteButton。我试着跟随你给出的路线。但一旦达到da.fill(ds)。它将提示我:用户“MCDU-PC34\apr13mpsip”登录失败。该链接使用的是SqlDataAdapter sadp,而不是dataset,您可以尝试使用SqlDataAdapter吗?@PorWeiting那么现在结果如何?=)在此处运行代码时遇到此错误:dv=ds.Tables[0].DefaultView;他们说找不到我的表名0。然后我把我的表名改为Student,这是我的表名,然后我在那里出错了。因此,我不确定[0]中的内容是什么。您的ConnString和StrQuery存在问题,请确保您的连接和查询是正确的
<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
AutoGenerateColumns="False" BackColor="White" BorderColor="#3366CC"
BorderWidth="1px" CellPadding="4" DataSourceID="SqlDataSource1" Height="50px"
Width="487px" AutoGenerateDeleteButton="True" BorderStyle="None" PageSize="15">