2012-01-24 2 views

答えて

3

あなたのコードから見ることができるのは、「名前」フィールドが空の行をすべて削除することです。あれは正しいですか?

あなたが戻った結果は、あなたの新しいデータテーブルではありません。代わりに、表示したいすべての行を含むIEnumerable<DataRow>が表示されます。

代わりに、好きではないものがすべて含まれているlinqクエリの結果を元に戻すことができます。その後、すべてのデータをデータテーブルから単純に削除します。

var rowsToDelete = dt.AsEnumerable() 
        .Where(row => String.IsNullOrEmpty(row.Field<string>("name")) 
        .ToList(); 

foreach(var row in rowsToDelete) 
{ 
    dataTable.Rows.Remove(row); 
} 
+0

私が 'dt.Rows.Clear();'を実行すると 'この行はテーブルから削除されており、データはありません。 'rowsToDelete'の中で' BeginEdit()はこの行に新しいデータを作成することができます ' –

+1

@just_name:はい、私はそれをテストしませんでした(私には恥じました)と単純なコピー(' .ToList() ')すべての単純なリストのようにdatatableで動作します。しかし、それは真実ではありません。だから私は単に私の答えからこのアプローチを削除し、後者のアプローチだけを使用することをお勧めします。 – Oliver

1

非NULL値を持つ新しいオブジェクトを作成します。

DataTable dt2 = new DataTable(); 
dt.AsEnumerable().Where(row => !row.IsNull("name")).Select(row => { dt2.Rows.Add(row); return true; }); 

は、既存のオブジェクトからNULL値を削除します

dt.AsEnumerable().Where(row => row.IsNull("name")).Select((row, index) => { dt.Rows.RemoveAt(index); return true; }); 

は、既存のオブジェクトを変更します:

dt.AsEnumerable().Where(row => row.IsNull("name")).Select((row, index) => 
{ 
    System.Diagnostics.Debug.WriteLine("Name in Row # " + index + " is null."); 
    row["Status"] = "Disabled"; 
    return true; 
});