СРС / Автономный режим / 10-Приложение, обесп сортировку и фильтрацию данных
.docx
10. Приложение Book.v10, реализующее отдельный уровень данных и обеспечивающее сортировку и фильтрацию данных
После заполнения объекта Dataset часто требуется работать с подмножеством его данных, загруженных в память. Такое подмножество выделяют при помощи объекта DataView. Объект DataView фактически выступает в роли фильтра для объекта DataTable, выбирающего из объекта DataTable некоторые данные и предоставляющего их элементам управления, связанным с этим объектом DataTable. Объект DataView поддерживает методы сортировки и фильтрации данных, а также позволяет обновлять представляемый им объект DataTable.
Чтобы создать объект DataView, необходимо передать ссылку на объект DataTable, для которого он будет выполнять фильтрацию содержимого:
DataTable dataTable
…
DataView view = new DataView(dataTable);
Этот код создает объект DataView, представляющий данные объекта DataTable. Чтобы задать критерии фильтрации упорядочения данных, следует установить соответствующие свойства объекта DataView. Можно создать объект DataView, не связанный с объектом DataTable, но в этом случае DataView будет недоступен для связывания, пока не будет определено его свойство Table:
DataView view = new DataView();
view.Table = dataTable;
Объекты DataView позволяют выполнять сортировку и фильтрацию данных, которые они представляют, при этом критерии сортировки и фильтрации разрешается изменять в период выполнения.
6.1. Сортировка данных
Чтобы упорядочить данные, установите свойство Sort объекта DatavView, записав в него строку, интерпретируемую как определение правил сортировки данных. Такая строка содержит имя поля, по которому выполняется сортировка:
view.Sort = "book_ID";
Чтобы задать упорядочение по нескольким полям, разделите их имена запятыми, например:
view.Sort = "u_surname, u_ststus";
Чтобы упорядочить поле по убыванию, добавьте к нему ключевое слово desc:
view.Sort = "u_surname DESC";
При изменении критериев сортировки объекта DataView обновляются все связанные с ним элементы управления.
Добавим в приложение Book.v9 возможность сортировки данных. Для удобства создадим в решении Disconnected новый проект Book.b10, полностью копирующий предыдущий, и расширим его функциональность.
Создадим в проекте новую форму – щелкнем ПКМ на проекте в обозревателе решений Добавить / Форма Windows… и назовем ее FSort (Name), Сортировка данных (Text).
Добавим на эту форму следующие элементы управления:
Panel – для группирования управляющих кнопок (свойство Dock: Bottom);
ListBox – для отображения списка полей объекта (Name: lbFields);
ListBox – для отображения списка сортируемых полей (Name: lbSort);
Button – для наполнения списка lbSort выбранными полями (Name: bAdd, Text – очистить);
Button – для удаления полей их списка lbSort (Name: bDelete, Text – очистить);
GroupBox и группу из двух элементов RadioButton для выбора порядка сортировки (rbAsc и rbDesc);
две кнопки – ОК и Cancel – для закрытия диалогового окна, которым зададим свойства DialogResult: DialogResult.OK и DialogResult.Cancel соответственно.
Добавим рисунки на кнопках: Проект / Добавить новый элемент / Файл ресурсов. Последовательно наполним этот файл нужными картинками (Добавить существующий файл). Подходящие иконки (DeleteHS.png и GoToNextHS.png) можно взять в библиотеке VS 2012 Image Library, которая поставляется вместе с Visual Studio 2012 или скачивается с сайта Microsoft.
Для кнопки bAdd в свойстве Image следует выбрать рисунок со стрелкой, для кнопки bDelete – с крестом.
Дизайн формы сортировки данных, получившейся в результате этих действий, показан на рисунке.
Для формы FSort создадим обработчик события Load. Соответственно, для кнопок добавления полей в список, удаления полей из списка и кнопки ОК создадим обработчики событий Click. При нажатии кнопки ОК в обработчике этого события формируется новое выражение из имен полей в списке lbSort, разделенных запятыми, и, в зависимости от выбора переключателя, добавляется ключевое слово ASC или DESC.
Полный код класса формы для сортировки данных приведен в листинге.
В класс UCGrid внесем дополнительные усовершенствования. Добавим свойство типа DataView для привязки объекта DataView из главной формы приложения, как показано в листинге.
Для вызова формы сортировки данных добавим на элемент dgvData пользовательского элемента UCGrid контекстное меню contextMenuGrid. Чтобы связать контекстное меню с элементом отображения данных, в свойстве ContextMenuStrip элемента dgvData выберем contextMenuGrid. В контекстном меню создадим пункт Sort и заведем для него обработчик события Click. В теле обработчика события Click пункта меню напишем код, как показано в листинге.
6.2. Фильтрация данных
Чтобы задать критерий фильтрации данных, надо записать в свойство RowFilter объекта DataView строку, интерпретируемую как выражение, которое определяет подмножество записей. Например, можно выбрать только строки с заданным значением в некотором поле:
view.RowFilter = "cat_ID = 1";
Выражения, записываемые в RowFiiter, должны подчиняться синтаксису SQL: строковые литералы необходимо заключать в одинарные кавычки, а даты – между символов "#". Для более сложных выражений применяют логические операми and, or, not, in, like, арифметические операторы, конкатенацию, сравнение.
Фильтры часто жестко задают в программном коде для определенных заранее критериев фильтрации, однако можно создать обобщенный фильтр, позволяющий работать с полями любого типа и задавать различные критерии фильтрации.
Добавим в проект новую форму, назовем ее FFiiter.
Задайте для нее свойства:
Name: FFilter
Text: "Настраиваемый фильтр:"
FormBorderStyle: FixedSingle
StartPosition: CenterParent
Добавьте на форму Panel (свойство Doсk – Bottom, два элемента управления ComboBox с именами cbCondition – для выбора условия фильтрации и cbData – для выбора или написания выражения в фильтре. Добавим две кнопки ОК и Cancel, которым зададим свойства DialogResult: OK и Cancel соответственно. Дизайн формы фильтра показан на рисунке.
Для выпадающего списка cbCondition в свойстве Items создайте коллекцию условий фильтрации как показано на рисунке.
Конструктор формы будет принимать в качестве параметра название столбца, по которому будет происходить фильтрация и экземпляр DataView. Код конструктора показан в листинге.
В теле обработчика события Click кнопки OK реализуем динамическое построение запроса к набору данных, находящихся в DataView. Запрос строится в зависимости от введенных пользователем условий фильтрации и аргументов. Реализация обработчика события Click кнопки ОК представлена в листинге.
Для вызова формы фильтрации данных добавьте в контекстное меню contexttMenuGrid новый пункт Filter и создайте для него обработчик события Click. Однако, в отличие от вызова формы сортировки данных, нам надо для вызова формы фильтрации данных знать имя столбца, по которому будет задаваться фильтр. Поэтому в программе необходимо определить, на каком столбце элемента управления DataGridView пользователь щелкнул мышью.
Для этого в классе DataGridView определено событие CellMouseUp. Это событие происходит, когда пользователь щелкает кнопкой на одной из ячеек и отпускает любую кнопку мыши. С помощью этого события мы можем определить индекс столбца, который выбрал пользователь, и сохранить его в переменную, как представлено в листинге.
Теперь переменную cIndex можно использовать для определения имени столбца и передать его в качестве параметра конструктору формы FFilter. В теле обработчика события Click пункта меню Filter напишите код, представленный в листинге.
Скомпилируйте и запустите приложение. Теперь можно задавать различные условия сортировки для выбранного объекта базы данных Book. Внешний вид приложения с сортировкой данных показан на рисунке. Сортировка по возрастанию осуществляется сначала по полю u_status, а затем по полю u_surname.
Можно также задавать различные условия фильтрации любого набора записей. На рисунке показан пример отбора клиентов с именем Александр.
Резюме
Решаемая задача – чтение данных из всех таблиц базы данных с возможностью их сортировки и фильтрации. Приложение работает в отсоединенном режиме. Несмотря на наличие навигатора, модификация данных не поддерживается.
Достоинства приложения:
не используется постоянное соединение с базой данных;
приложение эффективно отображает данные всех таблиц базы данных в виде множества документов с закладками;
обеспечивается сортировка и фильтрация данных;
из базы извлекаются типизированные данные.
Недостатки приложения:
приложение не позволяет модифицировать данные в таблицах;
названия полей объектов базы данных могут иметь не очень понятные для пользователя имена.