特定の条件に基づいてデータを並べ替え、UI コントロールを介してクライアントにデータを提示する機能は、データ バインディングの重要な側面です。 DataView には、データを並べ替え、特定の順序付け基準で並べ替えられたデータ行を返す方法がいくつか用意されています。 DataViewでは、文字列ベースの並べ替え機能に加えて、並べ替え条件に Language-Integrated クエリ (LINQ) 式を使用することもできます。 LINQ 式を使用すると、文字列ベースの並べ替えよりもはるかに複雑で強力な並べ替え操作が可能になります。 このトピックでは、 DataViewを使用した並べ替えの両方の方法について説明します。
並べ替え情報を含むクエリからの DataView の作成
LINQ to DataSet クエリから DataView オブジェクトを作成できます。 そのクエリに OrderBy、 OrderByDescending、 ThenBy、または ThenByDescending 句が含まれている場合、これらの句の式は、 DataView内のデータを並べ替える基礎として使用されます。 たとえば、クエリに Order By…
句と Then By…
句が含まれている場合、結果の DataView は、指定された両方の列でデータを並べ替えます。
式ベースの並べ替えでは、文字列ベースの並べ替えよりも強力で複雑な並べ替えが提供されます。 文字列ベースの並べ替えと式ベースの並べ替えは相互に排他的であることに注意してください。 クエリからSortが作成された後に文字列ベースのDataViewが設定されている場合、クエリから推論された式ベースのフィルターはクリアされ、リセットできません。
DataViewのインデックスは、DataViewが作成されたときと、並べ替えまたはフィルター処理の情報のいずれかが変更されたときに作成されます。 DataViewが作成される LINQ to DataSet クエリで並べ替え条件を指定し、後で並べ替え情報を変更しないことで、最適なパフォーマンスを得ることができます。 詳細については、「 DataView のパフォーマンス」を参照してください。
注
ほとんどの場合、並べ替えに使用される式は副作用を持たず、決定論的である必要があります。 また、並べ替え操作は何度でも実行される可能性があるため、式には、設定された実行回数に依存するロジックを含めないようにしてください。
例
次の例では、SalesOrderHeader テーブルを照会し、返された行を注文日で並べ替えます。はそのクエリから DataView を作成し、 DataView を BindingSourceにバインドします。
DataTable orders = _dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
orderby order.Field<DateTime>("OrderDate")
select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of DateTime)("OrderDate") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
例
次の例では、SalesOrderHeader テーブルに対してクエリを実行し、返された行を合計金額順に並べ替えます。はそのクエリから DataView を作成し、 DataView を BindingSourceにバインドします。
DataTable orders = _dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query =
from order in orders.AsEnumerable()
orderby order.Field<decimal>("TotalDue")
select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Decimal)("TotalDue") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
例
次の例では、SalesOrderDetail テーブルに対してクエリを実行し、返された行を注文数量と販売注文 ID で注文します。はそのクエリから DataView を作成し、 DataView を BindingSourceにバインドします。
DataTable orders = _dataSet.Tables["SalesOrderDetail"];
EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
String-Based Sort プロパティの使用
DataViewの文字列ベースの並べ替え機能は、LINQ to DataSet でも機能します。 LINQ to DataSet クエリから DataView が作成されたら、 Sort プロパティを使用して、 DataViewの並べ替えを設定できます。
文字列ベースと式ベースの並べ替え機能は、相互に排他的です。 Sort プロパティを設定すると、DataViewが作成されたクエリから継承された式ベースの並べ替えがクリアされます。
文字列ベースの Sort フィルター処理の詳細については、「 データの並べ替えとフィルター処理」を参照してください。
例
次の例では、Contact テーブルから DataView を作成し、行を姓順に並べ替え、名を昇順に並べ替えます。
DataTable contacts = _dataSet.Tables["Contact"];
DataView view = contacts.AsDataView();
view.Sort = "LastName desc, FirstName asc";
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc, FirstName asc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
例
次の例では、Contact テーブルに対して、文字 "S" で始まる姓を照会します。 DataViewはそのクエリから作成され、BindingSource オブジェクトにバインドされます。
DataTable contacts = _dataSet.Tables["Contact"];
EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
where contact.Field<string>("LastName").StartsWith("S")
select contact;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName").StartsWith("S") _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"
並べ替えのクリア
DataViewの並べ替え情報は、Sort プロパティを使用して設定した後でクリアできます。 DataViewで並べ替え情報をクリアするには、次の 2 つの方法があります。
例
次の例では、クエリから DataView を作成し、 Sort プロパティを空の文字列に設定して並べ替えをクリアします。
DataTable orders = _dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
orderby order.Field<decimal>("TotalDue")
select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;
view.Sort = "";
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Decimal)("TotalDue") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = ""
例
次の使用例は、Contact テーブルから DataView を作成し、姓順に並べ替える Sort プロパティを設定します。 並べ替え情報は、 Sort プロパティを null
に設定することでクリアされます。
DataTable contacts = _dataSet.Tables["Contact"];
DataView view = contacts.AsDataView();
view.Sort = "LastName desc";
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
'Clear the sort.
view.Sort = Nothing