次の方法で共有


DataView の DataRowView コレクションの照会

DataView は、DataRowView オブジェクトの列挙可能なコレクションを公開します。 DataRowView は、DataRow のカスタマイズされたビューを表し、DataRow の特定のバージョンをコントロールに表示します。 DataGridView などのコントロールを通じて、DataRow のバージョンを 1 つだけ表示できます。 DataRowViewDataRowViewRow プロパティを使用して公開している DataRow にアクセスできます。 DataRowView を使用して値を表示している場合は、RowStateFilter プロパティによって、基になる DataRow から公開される行バージョンが決まります。 DataRow を使用してさまざまな行バージョンにアクセスする方法については、「行の状態とバージョン」を参照してください。 DataView によって公開される DataRowView オブジェクトのコレクションは列挙可能であるため、LINQ to DataSet を使用して照会できます。

次の例では、Product テーブルに対して赤色の製品を照会し、そのクエリに基づくテーブルを作成します。 このテーブルから DataView を作成し、RowStateFilter プロパティに、削除行と変更行を条件とするフィルターを設定します。 次に DataView を LINQ クエリのソースとして使用し、変更済みおよび削除済みの DataRowView オブジェクトを DataGridView コントロールにバインドします。

Dim products As DataTable = dataSet.Tables("Product")

' Query for red colored products.
Dim redProductsQuery = _
From product In products.AsEnumerable() _
        Where product.Field(Of String)("Color") = "Red" _
        Order By product.Field(Of Decimal)("ListPrice") _
        Select product
' Create a table and view from the query.
Dim redProducts As DataTable = redProductsQuery.CopyToDataTable()
Dim view As DataView = New DataView(redProducts)

' Mark a row as deleted.
redProducts.Rows(0).Delete()

' Modify product price.
redProducts.Rows(1)("ListPrice") = 20.0
redProducts.Rows(2)("ListPrice") = 30.0

view.RowStateFilter = DataViewRowState.ModifiedCurrent Or DataViewRowState.Deleted

' Query for the modified and deleted rows.
Dim modifiedDeletedQuery = From rowView As DataRowView In view _
                           Select rowView

dataGridView2.DataSource = modifiedDeletedQuery.ToList()
DataTable products = dataSet.Tables["Product"];

// Query for red colored products.
EnumerableRowCollection<DataRow> redProductsQuery =
    from product in products.AsEnumerable()
    where product.Field<string>("Color") == "Red"
    orderby product.Field<decimal>("ListPrice")
    select product;

// Create a table and view from the query.
DataTable redProducts = redProductsQuery.CopyToDataTable<DataRow>();
DataView view = new DataView(redProducts);

// Mark a row as deleted.
redProducts.Rows[0].Delete();

// Modify product price.
redProducts.Rows[1]["ListPrice"] = 20.00;
redProducts.Rows[2]["ListPrice"] = 30.00;

view.RowStateFilter = DataViewRowState.ModifiedCurrent | DataViewRowState.Deleted;

// Query for the modified and deleted rows.
IEnumerable<DataRowView> modifiedDeletedQuery = from DataRowView rowView in view
                                                select rowView;

dataGridView2.DataSource = modifiedDeletedQuery.ToList();

次の例では、DataGridView コントロールにバインドされたビューから製品のテーブルを作成します。 DataView に対して赤色の製品を照会し、並べ替えた結果を DataGridView コントロールにバインドしています。

        ' Create a table from the bound view representing a query of 
        ' available products.
        Dim view As DataView = CType(bindingSource1.DataSource, DataView)
        Dim productsTable As DataTable = CType(view.Table, DataTable)

        ' Set RowStateFilter to display the current rows.
        view.RowStateFilter = DataViewRowState.CurrentRows

        ' Query the DataView for red colored products ordered by list price.
        Dim productQuery = From rowView As DataRowView In view _
                           Where rowView.Row.Field(Of String)("Color") = "Red" _
                           Order By rowView.Row.Field(Of Decimal)("ListPrice") _
                           Select New With {.Name = rowView.Row.Field(Of String)("Name"), _
                                        .Color = rowView.Row.Field(Of String)("Color"), _
                                        .Price = rowView.Row.Field(Of Decimal)("ListPrice")}

        ' Bind the query results to another DataGridView.
        dataGridView2.DataSource = productQuery.ToList()

// Create a table from the bound view representing a query of 
// available products.
DataView view = (DataView)bindingSource1.DataSource;
DataTable productsTable = (DataTable)view.Table;            

// Set RowStateFilter to display the current rows.
view.RowStateFilter = DataViewRowState.CurrentRows ;

// Query the DataView for red colored products ordered by list price.
var productQuery = from DataRowView rowView in view
                   where rowView.Row.Field<string>("Color") == "Red"
                   orderby rowView.Row.Field<decimal>("ListPrice")
                   select new { Name = rowView.Row.Field<string>("Name"),
                                Color = rowView.Row.Field<string>("Color"),
                                Price = rowView.Row.Field<decimal>("ListPrice")};

// Bind the query results to another DataGridView.
dataGridView2.DataSource = productQuery.ToList();

参照

概念

データ バインドと LINQ to DataSet