1

我有一个网格视图,当我单击第 2 页时,给出的错误在我的 sql 命令中突出显示:SqlCommand cmdShow = new SqlCommand("delete from Student where NRIC= '" + GridView1.DataKeys[0].Value + "'", conn);并声明错误是:Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

这是我的代码:

  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");
    }
4

4 回答 4

1

因此,当您确认单击delete按钮时,应删除行。根据您在 GridView 标记中的内容,请进行以下更正:

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

<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>

现在,您还需要更正您的 GridView 标记,因为您需要删除按钮将删除一行,并且您已将该GridView1_RowDeleted 函数分配为一个事件处理程序,onrowcommand这实际上没有任何意义。你的 GridView 标记应该是这样的:[否onrowcommand。保留AutoGenerateDeleteButton="true"]

<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">

现在,只需确保您要删除的行没有使用外键设置任何子行。如果您有 ,请先删除子行。

此外,当您单击任何分页链接(此处您单击第 2 页)时,也会onrowcommand调用,然后您正在删除没有任何逻辑的行。

而已。一旦您单击delete网格视图中的按钮,它将删除该行,前提是您已Delete正确设置命令以进行SqlDataSource控制。

只是重申代码中的错误:

  • 使用DataSourceId作为SqlDataSource控件,你需要设置Delete这个数据源控件的命令。当我们点击删除按钮时,GridView会相应地将这个传递给SqlDataSource正确的参数

  • onrowcommand 不应该用于删除一行。

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

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

于 2013-07-29T08:21:22.633 回答
1

检查是否GridView1.DataKeys不是空的。此错误只能由GridView1.DataKeys[0]在线操作员引起。

于 2013-07-29T01:39:59.863 回答
1

GridView1.DataKeys集合中有零个项目。

该错误消息意味着您试图访问数组集合的边界之外。只有在您正在索引数组或集合的地方出现GridView1.DataKeys

于 2013-07-29T01:41:10.763 回答
0

看看这个,永远记住你需要把它作为你的gridview分页

 protected void grdView_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
    grdView.PageIndex = e.NewPageIndex;
    grdView.DataSource = bindgrid();
    grdView.DataBind();  
}

这是示例代码链接

http://www.dotnetspider.com/resources/1249-Grid-View-Paging-Sorting.aspx

希望这可以帮助你=)

于 2013-07-29T02:48:43.670 回答