Задание 7. Поиск и фильтрация данных. Методы Filtr, Find объекта BindingSourse
Добавим в проект форму KlientAll, основанной на запросе, отсортированном по фамилиям. Форма содержит сведения о всех клиентах. Чтобы можно было отобрать всех клиентов отдельного города, добавим на форму поле со списком. Необходимо настроить поле ComboBox следующим образом:
Data Sourse – ГородBindingSource, то есть данные будут связаны с таблицей Город;
Display Member – Gorod, то есть отображаться в поле со списком будет поле Gorod;
Selected Value – none, то есть поле свободное, не связано ни с каким полем базы данных.
Отфильтровать данные КлиентЗапросBindingSource можно с помощью метода Filtr. Этот метод фильтрует записи по значению в некотором столбце. Синтаксис метода:
ИмяBindingSource.Filter = "Строка условия для фильтра"
Строка условия для фильтра имеет следующую конструкцию:
<Имя поля(столбца)> Оператор сравнения <Значение>
В нашем случае значение в поле со списком cmbGorod сравнивается со значениями в поле Gorod, которое содержится в запросе КлиентЗапрос. Так как тип поля Gorod текстовый, для установления равенства используется оператор Like:
|
|
КлиентЗапросBindingSource.Filter = "Gorod Like '" & cmbGorod.Text & "'"
Устанавливаем фильтр в процедуре SelectedIndexChanged поля со списком. Для отмены фильтра используется метод RemoveFilter():
КлиентЗапросBindingSource.RemoveFilter()
Метод Find
Для редактирования записи, открываем форму klient на текущей записи. В данном случае не подойдет метод Position объекта BindingSource. Если мы применили фильтр, то метод Position определяет номер записи в отфильтрованном наборе. Во-вторых нумерация записей в отсортированном запросе не соответствует нумерации записей в таблице.
Для нахождения нужной записи в КлиентыBindingSource формы klient воспользуемся методом Find. Этот метод возвращает порядковый номер записи в объекте BindingSource. Если искомая запись не найдена, то возвращается -1. Синтаксис метода:
ИмяBindingSource.Find("Имя поля", значение)
Для нахождения нужной записи лучше всего подходит поле первичного ключа, так как в этом случае можно быть уверенным, что не будет найдено несколько записей. То есть открываем форму klient на записи, КодКлиента, которой совпадает со значением поля КодКлиента текущей записи элемента управления DataGridView:
numCurrent = КлиентыBindingSource.Find("КодКлиента", КлиентЗапросDataGridView.CurrentRow.Cells(0).Value)
klient.КлиентыBindingSource.Position = numCurrent
При возвращении в форму klientAll в процедуре осуществляем поиск записи, КодКлиента, которой соответствует его значению в форме klient:
Me.КлиентЗапросBindingSource.Position = КлиентЗапросBindingSource.Find("КодКлиента", klient.КодКлиентаTextBox.Text)