2012-02-29 402 views
0

我正在使用一個網站,用戶可以從列表中添加和刪除視頻。
所有添加和刪除都是通過複選框完成的。我可以一次添加多個視頻,但是當我試圖刪除它們的多個在從列表中時,它給了我這個錯誤:「索引超出範圍...」錯誤

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事件。如果需要,我將顯示其他事件(btnAddVideo_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(); 
     } 
    } 
} 
+0

是不是因爲所有的後者的指數變化後的檢查框第一個被刪除,然後再次,然後再次。 – ediblecode 2012-02-29 17:14:07

+0

我會添加一些調試信息,以查看代碼失敗的確切位置。我猜'gvr。RowIndex'有時是負面的,所以也許你應該打印出來(或者一步步穿過它) – sebagomez 2012-02-29 17:14:10

+0

感謝您清除問題,我不知道該怎麼做,我爲此道歉。 – Peter 2012-02-29 17:31:12

回答

2

問題是btnDeleteVideo_Click的邏輯。

想象一下,您的列表中有5個項目,編號爲0到4,並且您嘗試一次刪除2個項目。

上面的代碼現在遍歷所有五行。當它到達第一次刪除時,它將通過從數據源中刪除和重新綁定來刪除一行。

它現在繼續循環,直到找到從刪除標記的第二個項目 - 除了您的網格現在包含一個較少的行,因爲您已刪除並反彈。

因此,線路String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString();將具有爆炸的趨勢,因爲原始RowIndex現在可能高於實際行數。

更好的方法是按照你的方式計算出你想要通過loopin刪除的所有行,但是隻能在最後刪除並重新綁定。

-2

如果我是正確的......你可以先嚐試鑄造的複選框的索引值。作爲也許值是一個字符串,如果你的索引數組可能會造成一個問題,一個字符串值..

這條線:

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

gvr.Rowindex嘗試將其轉換爲整數...第一

0

您在每次刪除後重新綁定您的網格,這會將行數減少一個 - 刪除所有內容然後重新綁定。

0

我建議移動

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

外的foreach循環。

2

不要調用foreach循環內GridView2.DataBind();,這樣做只是一個時間結束(就像你已經這樣做)

+0

它就像綁定在循環外面一樣簡單,哇。謝謝! – Peter 2012-02-29 17:38:28