2

DataView を ListBox にバインドする単純な Windows フォーム アプリケーションがあります。この DataView は、Linq を使用して、特定の列の降順で DataTable を並べ替えます。次に、ListBox が DataView にバインドされます。次に、DataTable にデータを追加するための単純なフォームを作成します。DataRow を DataTable に追加すると、ListBox に表示されます。

舞台裏で何が起こっているのか興味があります...読んだことがあります

DataView オブジェクトは、フィルター処理または並べ替えが可能な単一のデータ テーブルのカスタマイズされたビューです。データ ビューは、複雑にバインドされたコントロールで使用されるデータの "スナップショット" です。データ ビュー内のデータに単純バインドまたは複雑バインドできますが、クリーンで更新されたデータ ソースではなく、データの固定された "画像" にバインドしていることに注意してください。

DataView は「スナップショット」であるため、自動的に更新されないと思っていました。DataView は、基になる DataTable が変更されたときに更新するイベントを追加しますか? 誤解しないでください、これが私が望んでいる方法ですが、これは常に当てはまりますか?

4

1 に答える 1

2

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

DataView以下は、 LINQ を使用した場合のイベントの動的な性質を示しています。

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 は、基になる DataTable が変更されたときに更新するイベントを追加しますか?

これは内部実装の詳細ですが、これがイベントを使用している可能性があります。

のスナップショットを本当に作成したい場合は、DataTable.Copyメソッドを使用して をコピーできることに注意してください。DataTableDataTable

于 2009-11-24T23:51:19.367 に答える