2012-02-29 22 views
0

ユーザーがリストにビデオを追加したり削除したりすることができるサイトで作業しています。
追加と削除はすべてチェックボックスで行います。私は一度に複数のビデオを追加することができますが、私は、リストから一度にそれらの複数を削除しようとすると、それは私に、このエラーを与える:「インデックスが範囲外です...」エラー

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

しかし1つを削除する問題がないとき時間。また、私はエラーを取得し、チェックされたビデオがなくなって戻って行く。
これは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

最後にそれをちょうど1時間を行う、foreachループ内GridView2.DataBind();を呼び出さないでください、それではありません最初のものが削除され、次にもう一度削除されます。 – ediblecode

+0

デバッグ情報を追加して、コードがどこに問題があるのか​​を確認します。私は 'gvrを推測している。RowIndex'が負の値になることがあるので、それを印刷してください(またはステップスルー) – sebagomez

+0

質問を整理してくれてありがとう、私はそれをどうやって行うのか分からず、謝罪します。 – Peter

答えて

2

問題は論理btnDeleteVideo_Clickです。

リストに5つのアイテム(0〜4の番号が付けられています)を1つずつ削除しようとしたとします。

上記のコードは、5行すべてをループします。最初の削除に達すると、データソースから削除して再バインドして行を削除します。

削除からリバーブしてからグリッドに行が1つ少なくなっている点を除いて、削除から2番目の項目が見つかるまで、ループを継続します。

したがって、String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString();行は、元のRowIndexが実際の行数よりも高くなる可能性があるため、爆発する傾向があります。

より良いアプローチは、ループインで削除したい行をすべて削除し、最後に削除して再バインドすることです。すべての後者の屈折率変化は、後のボックスをチェックしているため

-2

私が正しいだ場合は、おそらく値が文字列であるとして...あなたが最初に..チェックボックスのインデックス値をキャストしようとすることができ、かつあなたのインデックスの問題を作成することができます配列内の文字列値..もし

このライン:

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

が整数にキャストしてみてくださいgvr.Rowindex ...最初

0

削除するたびにグリッドを再バインドします。これにより、行数が1つ減らされます。すべてを削除してから再バインドします。

0

私はあなたのforeachループの外で

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

を移動することをお勧め。

2

(あなたがすでにやっているように)

+0

ループの外側でバインディングするのと同じくらい簡単でした。ありがとうございました! – Peter

関連する問題