2013-07-29 40 views
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指数超出范围。必须是非负的,并小于集合的大小

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

嗨,我有2个问题,您的网页2是否包含任何项目?这是否发生在页面2页面加载? –

+0

我在我的数据库中有100个数据,我把它每个数据每页15个。但是一旦我点击第2页,它会提示我这个错误。是发生在第2页负载。 –

+0

在这种情况下,你需要显示你的分页代码=) –

回答

1

检查GridView1.DataKeys不epty。该错误只能由GridView1.DataKeys[0]运营商在线上引起。

+0

我该如何解决这个错误?我不知道如何去做。 –

1

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

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

+0

我应该把什么,而不是0的数据键。对不起,我对这一切都很陌生。 –

+0

'GridViewCommandEventArgs'包含行和被删除的键值的行索引。使用这些值。 RowDeleted事件发生在从GridView中删除行之后,因此当您询问一行时GridView可以为空 - 这会给您带来异常。请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewdeletedeventargs.aspx – shf301

0

检查了这一点,永远记住u需要把这个作为你的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

希望这可以帮助你出来=)

+0

我尝试按照你给的行。但一旦达到da.fill(ds)。它会提示我:用户'MCDU-PC34 \ apr13mpsip'登录失败。 –

+0

链接使用SqlDataAdapter sadp,而不是数据集,你可以尝试使用SqlDataAdapter吗? –

+0

@PorWeiting现在结果如何? =) –

1

所以,当你确认当你点击delete按钮时,行应该被删除。从您在GridView标记中获得的信息中,请进行以下更正:

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

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
ConnectionString="<%$ ConnectionStrings:NorthWindEntities %>" 
SelectCommand="Select top 20 ContactName,CompanyName,CustomerID from Customers" 
DeleteCommand="Delete from Customers where [email protected]" 
UpdateCommand="UPDATE Customers SET ContactName = ContactName, 
[email protected] WHERE CustomerID = @CustomerID" > 
</asp:SqlDataSource> 

现在,你还需要更正你的GridView的标记,因为你需要删除按钮将删除一行,并已分配的GridView1_RowDeleted功能的事件处理程序到onrowcommand这真的没有任何意义。你的GridView标记应该是这样的:[No 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按钮后,它将删除该行,前提是您已为SqlDataSource控件正确设置了Delete命令。

只是重申在代码中的错误:

  • 用的DataSourceID为SqlDataSource控制,你需要设置数据源的Delete命令control.when我们点击删除按钮在GridView将在此相应地传递给SqlDataSource使用正确的参数

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

  • 如果你想执行后一行被删除,请使用OnRowDeleted事件

让我知道,如果你需要进一步澄清一些代码。

相关问题