4

データを取得して に貼り付け、そのテーブルにバインドしてDataTable表示しています。DataGridView現在のグラブに含まれていないデータテーブル内のデータが削除されるようにしようとしています。私は次のようにしています:

public void FillTable(DataTable table, IEnumerable<MyObject> readings)
{
    var currentReadingsNames = new List<string>();
    var lastParent = string.Empty;
    var index = 0;

    foreach (var reading in readings)
    {
        if (reading.ParentName != lastParent)
        {
            lastParent = reading.ParentName;
            index = 0;
        }
        LoadRow(table, reading, index++);
        currentReadingsNames.Add(MakeKey(reading));
    }

    //Iterate through the rows in our data table. If the row is not one we just loaded, get rid of it.
    foreach (DataRow row in table.Rows)
    {
        if (!currentReadingsNames.Contains(MakeKey(row["ParentID"].ToString(), row["ID"].ToString())))
        {
            row.Delete();
        }
    }
    table.EndLoadData();
}

MakeKey(reading)2 つの異なる方法でオブジェクトを識別するために使用できる文字列をMakeKey(properties)返します。これが機能すると仮定します。

これを実行すると、次のようになります。

行を介して削除された行情報にアクセスすることはできません。

削除された行にアクセスしようとするべきではないように感じます。行の値 (parentIDおよびID列) を見終わってから行を削除するだけだからです。これは私が理解しているものとは異なる動作をしますか? なぜこれが起こっているのですか?このコードが機能する場合、エラーは別の場所にある可能性がありますが、他に何も変更していないので驚くでしょう (この削除動作を追加しようとしています)。

4

1 に答える 1

13

削除された行のフィルターを次のように追加するだけです。

foreach (DataRow row in table.Rows)
{
    if(row.RowState != DataRowState.Deleted) 
    {     
       if (!currentReadingsNames.Contains(MakeKey(row["ParentID"].ToString(), row["ID"].ToString())))
            {
                row.Delete();
            }
        }
    }
于 2013-04-17T17:39:41.423 に答える