2

データテーブル DT

num     type    name
===================================
001     A       Peter
002     A       Sam
003     B       John

public static void fun1(ref DataTable DT, String TargetType)
{
    for (int i = 0; i < DT.Rows.Count; i++)
    {
        string type = DT.Rows[i]["type"];

        if (type == TargetType)
        {
            /**Do Something**/
            DT.Rows[i].Delete();
        }
    }
    DT.AcceptChanges();
}

私の関数は、TargetType に従ってデータテーブル内の特定のデータ行を取得し、その情報を使用して何かを行います。データ行が読み取られた後 (対象の型に一致)、削除されます。

ただし、.Delete() の実行直後に行が削除されるため、次の行 (by i) の位置が正しくありません。

たとえば、TargetType が A の場合。i=0 の場合、.Delete の実行後に "Peter" 行が削除されます。次に、i=1 の場合、「Sam」行が検索されると思いますが、「Peter」行が削除されているため、実際には「John」行が検索されます。

コードに問題はありますか?

4

2 に答える 2

1

はい、コードに問題があります。DT.AcceptChanges()for ループの前にメソッドを呼び出す必要があります。追加されたすべての行の行状態を からAddedに変更しUnchangedます。メソッドを呼び出すと、Deleteメソッドを呼び出すまでデータテーブルから削除されずAcceptChanges、インデックスも同じままで次の行を指しません。

行の RowState が の場合、RowState は にAddedなり、AcceptChangesを呼び出すとDetached行がテーブルから削除されます。

于 2014-09-04T16:50:16.093 に答える