2012-02-28 88 views
0

我正在使用一个网站,用户可以从列表中添加和删除视频。所有的添加和删除都是通过复选框完成的。我可以一次添加多个视频,但是当我尝试从列表中删除多个视频时,它会给我这个错误:“索引超出范围。必须是非负值,并且小于集合。参数名称:索引“,但是当没有问题一次删除一个。另外,当我得到错误,并返回检查视频消失。索引超出范围例外

下面是两个添加和删除事件的代码:

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(); 
     } 
    } 
} 

我是新来的StackOverflow,所以我很抱歉,如果这是太多或太少的信息。编辑: 这是在C#ASP.NET中,我不知道错误在哪里,但我相信它是在btnDeleteVideo_Click事件。如果需要,我将显示其他事件(btnAddVideo_Click)作为参考。如果它有帮助,我可以删除它。

+1

这是太多*和*太少的信息。将代码减少到确切的失败并指定语言。 – 2012-02-28 20:34:43

回答

1

我的猜测是,你的问题是发生在btnDeleteVideo_Click方法,因为你在里面不断变化的数据结构(GridView2.Rows)for循环,而在引用它的循环。这在大多数语言中是不好的做法。我的建议是首先使所有选中的行的列表中你的循环,然后做一个一次性多行的删除,而不是做的每一行删除。