";索引超出范围";错误

本文关键字:quot 错误 范围 索引 | 更新日期: 2023-09-27 18:26:24

我正在开发一个网站,用户可以从列表中添加和删除视频
所有添加和删除操作都使用复选框完成。我可以一次添加多个视频,但当我试图一次从列表中删除多个视频时,会出现以下错误:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

但是,当没有问题时,一次删除一个。此外,当我得到错误并返回时,检查的视频都不见了
这是在C#ASP.NET中,我不确定错误在哪里,但我相信它在btnDeleteVideo_Click事件中。如果需要,我将显示另一个事件(btAddVideo_Click)作为参考。如果有帮助的话,我可以把它去掉。我是stackoverflow的新手,所以如果这是太多或太少的信息,我很抱歉。

以下是添加和删除事件的代码:

protected void btnAddVideo_Click(object sender, EventArgs e)
{
    foreach (GridViewRow gvr in GridView3.Rows)
    {
        CheckBox chkItem = (CheckBox)gvr.FindControl("cbAdd");
        if (chkItem.Checked)
        {
            String sRecID = GridView3.DataKeys[gvr.RowIndex].Value.ToString();
            Session["videorecid"] = sRecID;
            SqlDataSource2.Insert();
            SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
            GridView2.DataBind();
        }
    }
    GridView2.DataBind();
}
protected void btnDeleteVideo_Click(object sender, EventArgs e)
{
    foreach (GridViewRow gvr in GridView2.Rows)
    {
        CheckBox chkItem = (CheckBox)gvr.FindControl("cbDelete");
        if (chkItem.Checked)
        {
            String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString();
            Session["videorecid"] = sRecID;
            SqlDataSource2.Delete();
            SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
            GridView2.DataBind();
        }
    }
}

";索引超出范围";错误

问题出在btnDeleteVideo_Click的逻辑上。

假设您的列表中有5个项目,编号为0到4,并且您试图同时删除2个。

上面的代码现在在所有五行中循环。当它进行第一次删除时,它会通过从数据源中删除并重新绑定来删除一行。

它现在继续循环,直到找到第二个标记为删除的项目——除了你的网格现在少了一行,因为你已经删除并反弹了。

因此,行String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString();将有爆炸的趋势,因为原始RowIndex现在可能高于实际行数。

一个更好的方法是通过环入计算出所有要删除的行,但只在最后删除并重新绑定。

不要在foreach循环中调用GridView2.DataBind();,在结束时只调用一次(就像您已经在做的那样)

每次删除后都要重新绑定网格,这将使行数减少一行——删除所有内容,然后重新绑定。

我建议移动

SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
GridView2.DataBind();

在你的前臂环外。

如果我是正确的。。。您可以先尝试强制转换复选框索引值。。因为该值可能是一个字符串,如果在数组中为字符串值编制索引可能会产生问题。。

此行:

String sRecID=GridView3.DataKeys[gvr.RowIndex].Value.ToString();会话["videorecid"]=sRecID;

Rowindex尝试将其强制转换为整数。。。第一个