データテーブルを繰り返し処理で検索して検索結果がなければそのデータ行を削除したいのですが、エラーが出てしまいます。
解決方法を教えてください。
ループ中にデータテーブルの行を削除するとエラーが発生する理由 
データテーブルを For Each Row
などで繰り返し処理中に行を削除すると、データテーブルの構造が変更されるため、処理中のインデックスがずれてエラーが発生します。
これは 「ループ中にデータを削除すると、参照しているインデックスが変わるため、正しく処理できなくなる」 というプログラミングの一般的なルールによるものです。
解決策
ループ中に直接削除するのではなく、削除対象の行を記憶して、後で削除するのが安全な方法です。
削除対象の行番号をリストに記録する
For Each Row in DataTable
で条件に合致する行の RowIndex
をリストに追加
記憶したリストを繰り返し処理し、行を削除する
For Each
を使い、Remove Data Row
で記憶した行を削除
この方法なら、データテーブルの構造を変更する前に削除対象を確定できるため、安全に行の削除が可能です!
こんにちは。
基本的には @takehiro.ichikura 様の書かれているとおりの考え方で大丈夫だと思います。
あるいは今回提示のケースに限れば、繰り返しに入る前に
「データテーブルをフィルター」で削除対象のデータ行を消してしまうのも手かもしれませんね。
ご回答ありがとうございます。
どのアクテビティを使えばよいかが分からず、
お手数ですがアクテビティ名称を教えてもらえますでしょうか。
こんにちは
実現したいことは2つのDataTableのマッチングかと思いますので、方法はいろいろあるのですが、LINQ使った例をアップしておきます。(他にもDataTableをJoinする方法等も考えられます)
Sample20250130-2.zip (16.2 KB)
こんにちは
DeleteListはList<Int32>
で作成しておけば、整数を格納できますので
そのようにした方が良いと思います。また追加すべきはCurrentIndexです。
その上でReverseメソッド等このリストを逆順にした上で
繰り返しアクティビティでCurrentNumberを行削除アクティビティの行インデックスに直接指定できると思います。
ご回答ありがとうございます。
アドバイスいただいた箇所を修正しました。
リストはInt32型にし、リストに追加するのはCurrentIndexにしました。
データテーブルの行を削除する前にリストを並び替える方法が分かりません。。
申し訳ありませんがご教示お願いいたします。
変数の型があっていないですね。
変数パネルで型は List<Int32>
を定義して
最初の方に、代入アクティビティで
deleteList = New List(Of Int32)()
としてみてください。(この場合、リスト作成アクティビティは不要です)
currentXXXXが自動生成されていると思うので、それを入力ください。
あわせて繰り返しアクティビティの型がInt32になっていることも確認ください。
解決しました!
最後までご指導いただきありがとうございました。
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.