2011-01-27 12 views
1

私のロジックを少し微調整するのに助けが必要です。foreachループを破る

あなたは私がGridViewの にこのコードを別の列には2つのforeach loopとの両方を持って見ては、私がやっているまさに詳細はGridViewの中OnRowUpdatingであるあなたは、閉じたスレッドを見ることができますhere

問題は次のとおりです。

すべてのループで私はdbに行を更新しますが、私は2つの異なるループを持っているので、最初のループが終了するまで終了しません。

例:私は_rpt.Count = 2を持っていますので、2回目のループに入る前に2回ループします。

GridViewRow row = gv.SelectedRow;   
Repeater _rpt = gv.Rows[e.RowIndex].Cells[8].FindControl("rptReg") as Repeater; 
Repeater _rpt1 = gv.Rows[e.RowIndex].Cells[9].FindControl("rptVisitor") as Repeater; 

foreach (RepeaterItem item in _rpt.Items) 
{ 
    TextBox _txt = item.FindControl("txtId") as TextBox; 
    TextBox _txt1 = item.FindControl("txtName") as TextBox; 
    //update db 
} 

foreach (RepeaterItem item1 in _rpt1.Items) 
{ 
    TextBox _txt3 = item1.FindControl("txtVisitor") as TextBox; 
    //update db 
} 

私は両方のforeachループ値を読み取ることができる方法はありますか?

+0

'if'ブロックの中に' _txt3'の割り当てがあるため、更新中にエラーが発生しています。 'if'ブロックのスコープ内に参照を置く必要があります。そうでなければ、それが使用される前に割り当てられていることを確認してください。 – Jaymz

答えて

1

あなたはforeachがベストフィットではないかもしれないよりも、複数のコレクションを通じてループをやって、そして何度も各コレクションの詳細にアクセスしたいしている場合。

ではなく、通常の forループを試してみてください:

for (int i = 0; i < _rpt.Items.Count; i++) 
{ 
    TextBox _txt = _rpt.Items[i].FindControl("txtId") as TextBox; 
    TextBox _txt1 = _rpt.Items[i].FindControl("txtName") as TextBox; 

    if (_rpt1.Items.Count > i) 
     TextBox _txt3 = _rpt1.Items[i].FindControl("txtVisitor") as TextBox; 

    //update db 
} 

は上記のみif (_rpt.Items.Count >= _rpt1.Items.Count)を期待ように、仕事をチェックし、彼らがこれまでさまざまなことを行っている場合は、ほとんどの項目でコレクションを使用してくださいます。

foreachループを使用すると、単一のコレクション内のアイテムが列挙され、各繰り返し内の各アイテムを直接参照することができます。これは、配列インデクサーを使用する必要がないので、1つのコレクションにしかアクセスしていない場合に便利です。また、ループ初期化時に指定した名前を使用できます。

複数のコレクションをループしているときは、ループヘッダーで使用されているコレクションのみを参照するので、あまり便利ではありません。

forループを使用すると、あなたは(intを使用して)どのインデックスにあるのかを把握することができ、標準の配列表記を使用してコレクション内の項目を取得できます。

+0

@Jaymz:foreachが最適でない理由を少し詳しく説明できますか? - コメントしてくれてありがとう。 –

+0

@Abu - 答えに余分な説明が追加されました。それがどんなに明確になるかわからない... – Jaymz

+0

私は私の質問を更新しました。 –

1
foreach (RepeaterItem item in _rpt.Items) 
{ 
    TextBox _txt = item.FindControl("txtId") as TextBox; 
    TextBox _txt1 = item.FindControl("txtName") as TextBox; 
    //update db 

    TextBox _txt3 = _rpt1.Items[item.ItemIndex].FindControl("txtVisitor") as TextBox; 

} 
+0

ここから来る 'item1'はどこですか? –

+0

申し訳ありません、誤字、もう一度見てください – TheGeekYouNeed