Технология Microsoft ADO.NET

       

Объект DataView. Фильтрация и сортировка данных


В объект DataSet можно загрузить большое количество данных и затем, отсоединившись от источника, использовать их по частям. Объект DataView предназначен для работы с упорядоченной определенным образом частью данных, загруженных в DataSet. Подобно всем объектам ADO .NET, с ним можно работать как при помощи визуальных средств среды, так и программно.

Скопируйте папку приложения VisualDataSQL из первой лекции и переименуйте ее в VisualDataView. Открываем проект и перетаскиваем на форму еще один элемент DataGrid, свойству Dock которого устанавливаем значение Bottom. Выделив добавленный элемент DataGrid, перетащим на форму элемент управления Splitter (разделитель), свойству Dock которого также установим значение Bottom. В результате на форме располагаются две таблицы, в режиме запуска размеры покрытия их можно будет изменять, передвигая разделитель. Переключаемся на вкладку Data панели инструментов Toolbox и пертаскиваем на форму элемент DataView (рис. 9.1).


Рис. 9.1.  Элемент управления DataView

Добавленный объект появляется на панели компонент. Прежде всего следует определить, что будет представлять источник данных для него. Переходим в окно Properties, в свойстве Table выбираем таблицу Customers объекта DataSet (рис. 9.2).


Рис. 9.2.  Определение таблицы объекта DataView

Теперь определим фильтр, который будет определять содержимое DataView. Выбираем свойство RowStateFilter, нажимаем на кнопку "Original Rows" (рис. 9.3, A), затем снимаем все галочки, кроме "Deleted" (рис. 9.3, Б).


Рис. 9.3.  Окно свойств объекта DataView

Кнопка "Original Rows" переключает на свойства первоначальных (оригинальных), исходных записей, загружаемых в DataSet. Выбрав пункт "Deleted", мы тем самым отобрали фильтр для удаленных записей.

В окне Properties второго элемента DataGrid в свойстве DataSource устанавливаем объект DataView в качестве источника данных (рис. 9.4).


Рис. 9.4.  Определение объекта DataView в качестве источника данных для объекта DataGrid


Запускаем приложение. Выделяем записи поля CustomerID со значениями "ANTON" и "BLAUS" и удаляем их - они немедленно появляются во втором элементе DataGrid (рис. 9.5).


увеличить изображение
Рис. 9.5.  Удаленные записи оказываются во второй таблице

Изменим фильтр - в поле свойства RowStateFilter нажимаем на кнопку "Current Rows" (Текущие записи) и оставляем галочки на пунктах "New" и "Current Modified" (рис. 9.6):


Рис. 9.6.  Установка нового фильтра

Запускаем приложение. Теперь во вторую таблицу будут помещаться текущие записи, в которые были внесены изменения - в первой записи в поле City было добавлено "123", а также новые записи - прокручиваем список до конца и вводим данные (рис. 9.7).


увеличить изображение
Рис. 9.7.  Применение фильтра по новым и измененным записям

Каждый объект DataSet поддерживает две версии - исходную, полученную при загрузке из базы данных, и текущую, в которую были внесены изменения. Данные, выведенные на форму в элемент управления DataGrid, можно изменять, при этом фиксируется статус записей объекта DataRow с помощью свойства RowState. Свойство RowStateFilter осуществляет фильтрацию по этому свойству, причем кнопке "Original" соответствуют исходные данные, а кнопке "Current" - текущие. Значения этого свойства приведены в таблице 9.1.

Таблица 9.1. Значения свойства RowStateFilter объекта DataViewСвойство Описание
Unchanged Записи без изменений
New Новые записи
Deleted Удаленные записи
Current Modified Измененные записи с их текущими значениями
Original Modified Измененные записи с их первоначальными значениями
Как мы уже видели, для одного объекта DataView в пределах одной версии объекта DataSet (исходной или текущей) возможно объединение фильтров - например, отображение новых и удаленных записей.

Свойство RowFilter предназначено для вывода записей, содержащих определенное значение заданного поля. Установим свойству RowStateFilter значение по умолчанию - CurrentRows, - а затем в свойстве RowFilter введем фильтрацию (рис. 9.8):



City = 'London'


Рис. 9.8.  Свойство RowFilter объекта DataView

Запускаем приложение. Во второй таблице выводятся все записи с названием города "London" (рис. 9.9, А). Установив в свойстве RowFilter другое значение - ContactName = 'Thomas Hardy', - получаем одну запись, содержащую это значение (рис. 9.9, Б):


увеличить изображение
Рис. 9.9.  Вывод записей со значением "London" поля City (А) и записи со значением "Thomas Hardy поля ContactName (Б)

Свойство Sort предназначено для вывода записей в порядке возрастания (ascending, ASC) или убывания (descending, DESC) по значениям заданного поля. В принципе, элемент DataGrid сам по себе поддерживает сортировку - достаточно просто щелкнуть по заголовку поля. Однако это требует действий от пользователя, тогда как объект DataView может предоставлять данные уже в готовом виде.

Удаляем значение свойства RowFilter, в поле свойства Sort вводим "Sity ASC" (рис. 9.10):


Рис. 9.10.  Сортировка по полю City

Запускаем приложение. Во второй таблице отображаются записи со значениями поля City в порядке возрастания (рис. 9.11, А). Введем другое значение поля Sort - "ContactName DESC" - в результате получаем сортировку записей в порядке убывания по полю CompanyName (рис. 9.11, Б):


Рис. 9.11.  Сортировка записей по полю City (А), сортировка записей по полю ContactName (Б)

В программном обеспечении к курсу вы найдете приложение VisualData View (Code\Glava4\ VisualDataView).

Приступим теперь к рассмотрению этих же свойств объекта DataView, создаваемых программным образом. Скопируйте папку приложения ProgrammDataSQL и переименуйте ее в ProgrammDataView. Добавляем на форму второй DataGrid и Splitter точно так же, как мы это сделали в предыдущем приложении. Переходим в конструктор формы и изменяем код следующим образом:

public Form1() { InitializeComponent(); SqlDataAdapter dataAdapter = new SqlDataAdapter(CommandText, ConnectionString); DataSet ds = new DataSet(); //Создаем экземпляр dtCustomer объекта DataTable DataTable dtCustomer = ds.Tables.Add("Customer"); dataAdapter.Fill(ds, "Customer"); dataGrid1.DataSource = ds.Tables["Customer"].DefaultView; //Создаем экземпляр myDataView объекта DataView, //передаем ему объект dtCustomer DataView myDataView = new DataView(dtCustomer); //Устанавливаем фильтр для удаленных записей myDataView.RowStateFilter = DataViewRowState.Deleted; //Для второго элемента DataGrid указываем myDataView //в качестве источника данных.


dataGrid2.DataSource = myDataView; }

Объект DataView представляет данные объекта DataTable - именно поэтому нам пришлось создать экземпляр dtCustomer. Запускаем приложение и проверяем его функциональность - результат должен быть в точности такой же, как и ранее.

Для вывода новых строк (DataViewRowState.Added) и (символ "|" ) измененных (DataViewRowState.ModifiedCurrent) фильтр будет выглядеть так:

myDataView.RowStateFilter = ((DataViewRowState)((DataViewRowState.Added | DataViewRowState.ModifiedCurrent)));

Закомментируем в коде свойство RowStateFilter. Для вывода фильтров по свойству RowFilter используем следующие фрагменты кода:

//Выводим все записи со значением 'London' поля City: myDataView.RowFilter = "City = 'London'";

Или

//Выводим все записи со значением 'Thomas Hardy' поля ContactName: myDataView.RowFilter = "ContactName = 'Thomas Hardy'";

Закомментируем после проверки в коде эти фрагменты и добавим сортировку записей:

// Сортируем записи по полю "City" в порядке возрастания myDataView.Sort = "City ASC";

Или

//Сортируем записи по полю ContactName в порядке убывания myDataView.Sort = "ContactName DESC";

В программном обеспечении к курсу вы найдете приложение Programm DataView (Code\Glava4\ ProgrammDataView).


Содержание раздела