Лекция № 12
Тема: "Сортировка и фильтрация данных"
План
1. Сортировка данных
2. Интерактивный поиск данных
3. Фильтрация данных
1. Сортировка данных
При отображении данных из таблицы БД в сетке DataGridView функция сортировки с помощью щелчка на заголовках колонок реализована автоматически. При этом каждая колонка имеет свойство SortMode, с помощью которого можно отключить сортировку для колонки.
Также существует возможность сортировки в наборе данных с помощью свойства Sort компонента BindingSource. Для программной сортировки данных необходимо свойству Sort присвоить имя нужного поля с указанием направления сортировки: ASC - сортировка по возрастанию (действует по-умолчанию, можно не указывать), DESC - сортировка по убыванию.
Например, для сортировки в наборе данных sotrBindingSource по полю fam нужно ввести команду:
sotrBindingSource.Sort="fam"; // сортировка по возрастанию
sotrBindingSource.Sort="fam DESC"; // сортировка по убыванию
Допускается сортировка по нескольким полям. Список полей для сортировки указывается через запятую.
Например, для сортировки в наборе данных sotrBindingSource по полям id_dolg, fam нужно ввести команду:
sotrBindingSource.Sort="id_dolg, fam";
2. Интерактивный поиск данных
Одной из основных функций информационной системы является поиск данных по различным критериям. Функция поиска предполагает, что указатель в наборе данных устанавливается на найденную запись. При этом, если существует несколько записей, отвечающих условию, то вначале необходимо данные отсортировать по полю поиска, а затем выполнить поиск. В результате указатель станет на первую найденную запись, а остальные окажутся сразу под ней.
Для выполнения поиска набор данных BindingSource имеет метод Find("имя_поля", условие_поиска). Данный метод возвращает номер найденной записи в наборе данных. Если найденный номер присвоить свойству Position, то указатель переместится на найденную запись.
При этом условие поиска задается в зависимости от типа поля:
- для текстовых полей условие берется в кавычки;
- для полей дата/время записывается в кавычках в формате #MM/dd/yyyy#;
- для числовых полей условие записывается без кавычек.
Пример. В наборе данных sotrBindingSource выполнить в поле fam поиск значения "Алферова".
sotrBindingSource.Position=sotrBindingSource.Find("fam","Алферова");
Пример. В наборе данных sotrBindingSource выполнить в поле oklad поиск значения 5000.
sotrBindingSource.Position=sotrBindingSource.Find("oklad",5000);
Пример. В наборе данных sotrBindingSource выполнить в поле datar поиск значения 03.05.1972.
sotrBindingSource.Position=sotrBindingSource.Find("datar","#05/03/1972#");
3. Фильтрация данных
Фильтрация также выполняет поиск, но те записи, которые не соответствуют заданному условию, временно скрываются от просмотра.
Для фильтрации набор данных BindingSource используется свойство Filter = "условие поиска".
Условие поиска может состоять из нескольких простых условий по разным полям. При этом такие условия соединяются операциями AND или OR.
Например:
//фильтруем данные (фамилия начинается на А и средний балл = 5)
sotrBindingSource.Filter = "fam like 'А%' and srbal = 5";
//отображаем все данные (выключаем фильтрацию)
sotrBindingSource.Filter = null;
При записи условий поиска надо использовать следующие правила:
- ключ для поиска по текстовым полям берется в одинарные кавычки:
fam = 'Иванов'
- если поиск по текстовым полям выполняется по части символов, то используют функцию like и символы подстановки %.
"fam like 'ива%'" //начинается на ива
"fam like '%ива'" //заканчивается на ива
"fam like '%ива%'" //содержит ива
- ключ для поиска по числовым полям в кавычки не берется:
oklad = 1500, oklad <= 1500, oklad> = 1500 и т.д.
- ключ для поиска по датам берется в кавычки и записывается в формате #MM/dd/yyyy#
"#12/05/1972#" //аналог даты 05.12.1972
Форматирование дат для условий поиска
При вводе условий поиска пользователь будет задавать даты в обычном формате: dd.mm.yyyy. Такой формат не всегда подходит для использования в запросах, поэтому его предварительно нужно конвертировать в нужный формат.
В качестве шаблона надо указать запись вида: #MM/dd/yyyy#
Пример. В поле textBox1 введена дата в обычном формате. Надо конвертировать ее в формат для фильтрации. Содержимое поля textBox1 из текста нужно конвертировать в дату, а затем опять в текст, но в нужном формате:
Convert.ToDateTime(textBox1.Text).ToString("#MM'/'dd'/'yyyy#");
Обратите внимание, что символ '/' берется в одинарные кавычки. Если этого не сделать, то метод ToString() для данных Дата/Время заменяет символ '/' на точку. Если же этот символ взять в одинарные кавычки, то метод ToString() записывает его в исходном виде, ничего не заменяя.
Пример фильтрации данных
Выполнение фильтрации рассмотрим на примере. Пусть имеется форма для поиска данных:

Пользователь может выборочно ввести условия поиска в нужных полях. Для текстовых полей можно поиск выполняется по первым введенным символами, для полей Дата рождения и Оклад можно ввести диапазон значений или один из отрезков диапазона.
Кнопка "Применить фильтр" формирует условие, фильтрует данные, отображая их в сетке. Для кнопки напишем код:
private void button1_Click_1(object sender, EventArgs e)
{
//переменная для формирования условия поиска
string s = "";
//задаем условие поиска для поля "fam" (текстовое)
if (textBox1.Text != "")
s += "fam like '" + textBox1.Text + "%'";
//задаем условие поиска для поля "imya" (текстовое)
if (textBox2.Text != "")
if (s != "")
s += " and imya like '" + textBox2.Text + "%'";
else
s += "imya like '" + textBox2.Text + "%'";
//задаем условие поиска для поля "otch" (текстовое)
if (textBox3.Text != "")
if (s != "")
s += " and otch like '" + textBox3.Text + "%'";
else
s += "otch like '" + textBox3.Text + "%'";
//задаем условие поиска для поля "datar" (дата от) (дата/время)
//обратите внимание на то, что содержимое поля textBox4
//конвертируется в формат представления дат #MM/dd/yyyy#
if (textBox4.Text != "")
if (s != "")
s += " and datar >=" + Convert.ToDateTime(textBox4.Text).ToString("#MM'/'dd'/'yyyy#");
else
s += "datar >=" + Convert.ToDateTime(textBox4.Text).ToString("#MM'/'dd'/'yyyy#");
//задаем условие поиска для поля "datar" (дата до) (дата/время)
//обратите внимание на то, что содержимое поля textBox5 конвертируется
//в формат представления дат #MM/dd/yyyy#
if (textBox5.Text != "")
if (s != "")
s += " and datar <=" + Convert.ToDateTime(textBox5.Text).ToString("#MM'/'dd'/'yyyy#");
else
s += "datar <=" + Convert.ToDateTime(textBox5.Text).ToString("#MM'/'dd'/'yyyy#");
//задаем условие поиска для поля "oklad" (оклад от) (числовое)
if (textBox6.Text != "")
if (s != "")
s += " and oklad >=" + textBox6.Text;
else
s += "oklad >=" + textBox6.Text;
//задаем условие поиска для поля "oklad" (оклад до) (числовое)
if (textBox6.Text != "")
if (s != "")
s += " and oklad <=" + textBox6.Text;
else
s += "oklad <=" + textBox6.Text;
//применяем условие как фильтр для отбора
sotrBindingSource.Filter = s;
}
Кнопка "Показать все" очищает все поля для ввода условий фильтрации и очищает фильтр для отображения в сетке всех записей. Для кнопки напишем код:
private void button2_Click_1(object sender, EventArgs e)
{
//очищаем все поля
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
textBox6.Clear();
textBox7.Clear();
//снимаем фильтр для отображения всех записей
sotrBindingSource.Filter = null;
}
Вопросы для самоконтроля
1. Какое свойство позволяет выполнить сортировку в наборе данных? Как указать направление сортировки?
2. Какой метод позволяет выполнять поиск в наборе данных? Приведите синтаксис этого метода.
3. Как выполняется фильтрация данных в наборе данных? Какие особенности задания условий для фильтрации по текстовым и числовым полям вы знаете?
4. Какие особенности задания условий для фильтрации для полей типа Дата/Время вы знаете? Как можно привести дату в нужный формат для использования в условиях фильтрации?