Лекция № 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. Какие особенности задания условий для фильтрации для полей типа Дата/Время вы знаете? Как можно привести дату в нужный формат для использования в условиях фильтрации?