Wykonywanie zapytania do kolekcji DataRowView w widoku danych

Obiekt DataView uwidacznia wyliczenie kolekcji DataRowView obiektów. DataRowView reprezentuje dostosowany widok elementu DataRow i wyświetla określoną wersję DataRow elementu w kontrolce. Tylko jedna wersja elementu DataRow może być wyświetlana za pomocą kontrolki, takiej jak DataGridView. Dostęp do DataRow obiektu uwidocznionego przez DataRowViewRow właściwość DataRowView. Podczas wyświetlania wartości przy użyciu DataRowViewelementu właściwość określa, RowStateFilter która wersja wiersza bazowego DataRow jest uwidoczniona. Aby uzyskać informacje na temat uzyskiwania dostępu do różnych wersji wierszy przy użyciu elementu DataRow, zobacz Stany wierszy i Wersje wierszy. Ponieważ kolekcja DataRowView obiektów uwidocznionych przez DataView obiekt jest wyliczana, możesz użyć linQ to DataSet, aby wykonać względem niego zapytanie.

Poniższy przykład wykonuje zapytanie Product dotyczące tabeli dla produktów w kolorze czerwonym i tworzy tabelę na podstawie tego zapytania. Element A DataView jest tworzony na podstawie tabeli, a RowStateFilter właściwość jest ustawiona na filtrowanie usuniętych i zmodyfikowanych wierszy. Element DataView jest następnie używany jako źródło w zapytaniu LINQ, a DataRowView obiekty, które zostały zmodyfikowane i usunięte, są powiązane z kontrolką DataGridView .

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();
var 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();
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()

Poniższy przykład tworzy tabelę produktów z widoku powiązanego z kontrolką DataGridView . Zapytanie DataView dotyczy produktów w kolorze czerwonym, a uporządkowane wyniki są powiązane z kontrolką DataGridView .

// Create a table from the bound view representing a query of
// available products.
var view = (DataView)bindingSource1.DataSource;
DataTable productsTable = 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();
' 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()

Zobacz też