Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СРС / Автономный режим / 10-Приложение, обесп сортировку и фильтрацию данных

.docx
Скачиваний:
4
Добавлен:
28.06.2021
Размер:
806.77 Кб
Скачать

14

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сkBottom, два элемента управления 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.

Можно также задавать различные условия фильтрации любого набора записей. На рисунке показан пример отбора клиентов с именем Александр.

Резюме

Решаемая задача – чтение данных из всех таблиц базы данных с возможностью их сортировки и фильтрации. Приложение работает в отсоединенном режиме. Несмотря на наличие навигатора, модификация данных не поддерживается.

Достоинства приложения:

  • не используется постоянное соединение с базой данных;

  • приложение эффективно отображает данные всех таблиц базы данных в виде множества документов с закладками;

  • обеспечивается сортировка и фильтрация данных;

  • из базы извлекаются типизированные данные.

Недостатки приложения:

  • приложение не позволяет модифицировать данные в таблицах;

  • названия полей объектов базы данных могут иметь не очень понятные для пользователя имена.