2012-05-01 8 views
0

Visual Basicで記述されたFor Eachループが、反復処理中のテーブルを変更しようとしています。これによりコレクションが変更されました。列挙操作は「例外を実行しない場合があります。これについてfrastratingさこのVisual Basic.netループを再現して動作させるにはどうすればよいですか?

私は私が使用してのみコピーから削除されたすべてのオブジェクトのコピーを作成しようとしましたが、例外はまだ起こっていることである。

これはForループの代わりにFor Eachループを使用していることが原因であることがわかりましたが、私のコードを書き直して動作させることはできませんでした(私はC#をよく知っています)。ここをクリック

これは私のコードです。削除したい行を削除するには、どのように書き直すことができますか?どのヘルプとコードも非常に高く評価されますか?

Dim drAcademicRecord, drSchool As DataRow 
For Each drSchool In dsR.Tables("School").Rows 
    If drSchool("OrganizationName") = "NA" Then 
     For Each drAcademicRecord In dsR.Tables("AcademicRecord").Rows 
      If drAcademicRecord("AcademicRecord_Id") = drSchool("AcademicRecord_Id") Then 
       dsR.Tables("AcademicRecord").Rows.Remove(drAcademicRecord) '<-- This is the line causing my exception 
      End If 
     Next 
    End If 
Next 
+0

vb.netが私を悩ませます – JonH

+0

なぜ複数のテーブルを反復処理しますか? DataRelationsを見てください:http://msdn.microsoft.com/en-us/library/0k21zcyx%28v=vs.100%29.aspx –

+0

ありがとう、私はそれを見ていきます。私は元のコードを書いていないので、私が持っていたものを使っていました。 – user1179071

答えて

1

すでにdrAcademicRecordを持っているので、あなたが直接

drAcademicRecord.Delete 

例えばによってその行を削除することができますので、あなたは、

dsR.Tables("AcademicRecord").Rows.Remove(drAcademicRecord) 

を使用する必要はありません

For Each drSchool As DataRow In dsR.Tables("School").Select("OrganizationName='NA'") 
    For Each drAcademicRecord As DataRow In dsR.Tables("AcademicRecord").Select("AcademicRecord_Id=" & drSchool("AcademicRecord_Id")) 
     drAcademicRecord.Delete 
    Next 
Next 
+0

ありがとうございます!それは繁盛し、私は新しいことを学びました。奇妙なことに、ループ内でこのコードが同じ例外を生成しないのに、なぜこのコードが同じ例外を生成しないのか分かりますか? もう一度おねがいします! – user1179071

+1

DataTowを削除すると、DataTableは自身のインデックスを再作成します。したがって、 'dsR.Tables(" AcademicRecord ")を使用してループすると、Rows(i)'は削除された無効なインデックスにアクセスできます。私はテーブルのインデックスを変更する可能性があるレコードを追加または削除する必要があるときにインデックスを使用してDataRowにアクセスしません – Nick

+0

説明ありがとうございます! – user1179071

3
For i as integer = dsR.Tables("AcademicRecord").Rows.Count - 1 to 0 Step -1 
    If dsR.Tables("AcademicRecord").Rows(i)("AcademicRecord_Id") = drSchool("AcademicRecord_Id") Then 
     dsR.Tables("AcademicRecord").Rows.RemoveAt(i) 
    End If 
Next 
+0

ありがとうございました!本質的に後退し、常にitenmsを繰り返すことによって例外が回避されると仮定するのは正しいですか? – user1179071

+1

いいえ、コレクションをトラバースする列挙子を使用しないため、例外が回避されます。また、後方に移動することで、アイテムを削除するときに手動で 'i'変数を減らす必要がなくなります。 – GSerg

+0

それは完璧な意味合いがあります。私は本当にあなたの助けに感謝します。 – user1179071

関連する問題