4.4.4. Объект DataViewВ объект DataSet можно загрузить большое количество данных и затем, отсоединившись от источника, использовать их по частям. Объект DataView предназначен для работы с упорядоченной определенным образом частью данных, загруженных в DataSet. Подобно всем объектам ADO .NET, с ним можно работать как при помощи визуальных средств среды, так и программно.
Фильтрация данных
Создадим новое Windows-приложение. На форму добавим соединение с SQL-базой данных и два компонента DataGridView. Первый компонент настроим на отображение таблицы «Туристы». Для второго компонента сформируем следующий код в обработчике события Form_Load: DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Туристы); Запустив приложение, удалим последнюю строку таблицы «Туристы». Она удаляется из первого компонента DataGridView и появляется во втором (рис. 126). Рис. 126. Демонстрация удаленных записей Для одного объекта DataView в пределах одной версии объекта DataSet (исходной или текущей) возможно объединение фильтров - например, для отображения новых и удаленных записей. Для вывода новых строк (DataViewRowState.Added) и измененных (DataViewRowState.ModifiedCurrent) фильтр будет выглядеть так: myDataView.RowStateFilter = ((DataViewRowState)((DataViewRowState.Added | DataViewRowState.ModifiedCurrent))); Возможные значения свойства RowStateFilter приведены в таблице 17. Свойство RowFilter предназначено для вывода записей, содержащих определенное значение заданного поля. Таблица 17. Значения свойства RowStateFilter объекта DataView
В качестве примера установим фильтрацию по фамилии «Иванов»: DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Tуристы); После запуска приложения во второй таблице выводятся все записи с фамилиями туристов «Иванов» (рис. 127). Рис. 127. Фильтрация записей по содержимому поля
Сортировка данных
Свойство Sort предназначено для вывода записей в порядке возрастания (ascending, ASC) или убывания (descending, DESC) по значениям заданного поля. В принципе, элемент DataGridView сам по себе поддерживает сортировку - достаточно просто щелкнуть по заголовку поля. Однако это требует действий от пользователя, тогда как объект DataView может предоставлять данные уже в готовом виде. Удалим значение свойства RowFilter, в поле свойства Sort введем «Фамилия ASC» (результат на рис. 128): DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Туристы); Рис. 128. Сортировка данных по полю «Фамилия»
Поиск данных
Технология ADO .NET предоставляет значительные возможности для поиска данных - такие объекты, как DataSet, DataTable, содержат специализированные методы для быстрого решения этой задачи. Свойство RowFilter объекта DataView может применяться для создания простого и эффективного поиска. Запускаем Visual Studio 2008 и создаем новый проект типа Windows Forms Control Library (рис. 129). Внешний вид формы в режиме дизайна представлен на рисунке 130. Перейдем к коду. В конструкторе формы отключаем доступность текстового поля и привязываем обработчик события CheckedChanged для элемента CheckBox: public FindCheckBox() { В классе формы создаем обработчик события CheckedChanged для CheckBox и определяем действия для значений текстового поля, надписи и элемента CheckBox. Рис. 129. Выбор шаблона Windows Forms Control Library Рис. 130. Форма компонента в режиме дизайна private void chbForSearching_CheckedChanged(object sender, EventArgs e) { Свойства ColumnName, ColumnValue и SearchEnabled будут свойствами композитного элемента управления, которые будут отображаться в его окне Properties. В квадратных скобках указан атрибут для помещения свойства в заданную группу и описание, выводимое на информационную панель. Откомпилируем приложение и закроем его. Создадим новое Windows-приложение, которое будет использовать созданный компонент. Расположим на форме следующие элементы управления: Panel, свойству Dock которого установим значение Left, Splitter и DataGridView (свойству Dock последнего устанавливаем значение Fill). Добавим созданный компонент в окно ToolBox и перетаскиваем на панель формы из окна Toolbox четыре копии элемента FindCheckBox. Вид формы приложения в режиме дизайна приведен на рисунке 131. Обратите внимание, что в окне Properties, при групповом расположении, свойство ColumnName находится в группе Appearance. На информационную панель выводится описание этого свойства на русском языке. Именно эти параметры были указаны при создании композитного элемента. Добавим обработчик кнопки «Поиск»: private void btnSearch_Click(object sender, System.EventArgs e) { Рис. 131. Расположение элементов на форме В классе формы создаем метод FindCustomers, в котором будет осуществляться обработка и который вызывается в обработчике кнопки «Поиск»: private void FindCustomers() { Как видно из приведенного кода, для объединения условий, накладываемых на поля, используется логический оператор «ИЛИ». Путем некоторого усложнения кода и созданного компонента для поиска можно создать возможность одновременного использования операторов «И» и «ИЛИ» Запустим приложение. Первый поисковый запрос будет запрашивать всего одно поле (рис. 132). Рис. 132. Простой поисковый запрос Усложним запрос: зададим условие на два поля (рис. 133). Рис. 133. Более сложный поисковый запрос
|