2009-08-26 11 views
2

DataViewをListBoxにバインドする単純なWindowsフォームアプリケーションがあります。このDataViewはLinqを使用して、特定の列の降順でDataTableをソートします。私のリストボックスは、DataViewにバインドされます。私はDataTableにデータを追加する簡単なフォームを持っています。 DataTableにDataRowを追加すると、ListBoxに表示されます。.Net DataViewとDataTableバインディング

私は舞台裏で起こっていただきました!のように好奇心が強い... I've read

DataViewオブジェクトは、 をフィルタリングまたはソートすることができる単一のデータ・テーブルのカスタマイズされたビュー です。データビューは、複合バインドの コントロールによって使用されるデータ「スナップショット」 です。データ ビュー内のデータには、 のデータが複雑にバインドされますが、 データソースではなく、 データの固定「写真」にバインドされていることに注意してください。

DataViewは「スナップショット」なので、自動的には更新されないと私は考えていました。 DataViewは、基になるDataTableが変更されたときに更新するイベントを追加しますか?私が間違ってはいけない、これは私がそれを働かせたいのですが、これはいつものケースですか?

答えて

2

DataViewはスナップショットではありません。基礎となるDataTableが変更されると自動的に更新されます。 DataViewのフィルタ条件を満たすDataTableに追加された新しい行は、自動的にDataViewに表示されます。同様に、DataTableから削除された行は、DataViewから自動的に消えます。

using System; 
using System.Linq; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("FirstName"); 

      var query = from row in dt.AsEnumerable() 
         where row.Field<string>("FirstName").StartsWith("S") 
         select row; 

      DataView view = query.AsDataView(); 

      Console.WriteLine(view.Count); // Prints 0 
      dt.Rows.Add("Sam"); 
      dt.Rows.Add("John"); 
      Console.WriteLine(view.Count); // Prints 1 
      dt.Rows.Add("Sally"); 
      dt.Rows.Add("Mary"); 
      Console.WriteLine(view.Count); // Prints 2 
      dt.Rows.RemoveAt(0); 
      Console.WriteLine(view.Count); // Prints 1 
     } 
    } 
} 

のDataViewは、基礎となるデータテーブルが変更されたときに更新するようにイベントを追加します:

以下は、LINQを使用していてもDataViewの動的な性質を示していますか?

これは内部実装の詳細ですが、これはイベントを使用すると考えられます。

DataTableのスナップショットを実際に作成する場合は、DataTable.Copyメソッドを使用してDataTableをコピーすることができます。

関連する問題