Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Возможность сортировки данных на основе определенных критериев, а затем представления данных клиенту с помощью элемента управления пользовательским интерфейсом является важным аспектом привязки данных. DataView предоставляет несколько способов сортировки данных и возврата строк данных, упорядоченных определенными критериями упорядочивания. Помимо возможностей сортировки на основе строк, DataView также позволяет вам использовать выражения Language-Integrated запроса (LINQ) в качестве критериев сортировки. Выражения LINQ позволяют выполнять гораздо более сложные и мощные операции сортировки, чем сортировка на основе строк. В этом разделе описаны оба подхода к сортировке с помощью DataView.
Создание DataView из запроса с помощью сведений о сортировке
Объект DataView можно создать из запроса LINQ to DataSet. Если этот запрос содержит условие OrderBy, OrderByDescending, ThenBy или ThenByDescending, то выражения в этих условиях используются в качестве основы для сортировки данных в DataView. Например, если запрос содержит предложения Order By…
и Then By…
, результат DataView упорядочит данные по обоим указанным столбцам.
Сортировка на основе выражений обеспечивает более мощную и сложную сортировку, чем более простая сортировка на основе строк. Обратите внимание, что сортировка на основе строк и выражений являются взаимоисключающими. Если строка Sort задана после создания DataView из запроса, фильтр на основе выражений, полученный из запроса, очищается и не может быть сброшен.
Индекс для объекта DataView создается как при его DataView создании, так и при изменении любой информации о сортировке или фильтрации. Вы получите лучшую производительность, если укажете условия сортировки в запросе LINQ to DataSet, на основе которого создается DataView, и не будете изменять сведения о сортировке впоследствии. Дополнительные сведения см. в разделе "Производительность 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
Функции сортировки DataView на основе строк по-прежнему работают с LINQ to DataSet. После создания DataView из запроса с использованием LINQ to DataSet можно использовать свойство Sort для установки сортировки на DataView.
Функции сортировки на основе строк и выражений являются взаимоисключающими. Установка свойства Sort очистит сортировку на основе выражений, которая была унаследована от запроса, из которого создан DataView.
Дополнительные сведения о фильтрации на основе Sort строк см. в разделе "Сортировка и фильтрация данных".
Пример
Следующий пример создает объект DataView из таблицы Contact и сортирует строки по фамилии в порядке убывания, а затем по имени в порядке возрастания.
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()
Пример
В следующем примере таблица контактов запрашивает фамилии, начинающиеся с буквы "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.
Пример
В следующем примере из запроса создается 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 = ""
Пример
Следующий пример создает DataView из таблицы Contact и задает 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