Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
1
.NET 4.x

Фильтр по нескольким полям в bindingsource

09.12.2013, 12:37. Показов 4885. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Появилась необходимость фильтровать данные по нескольким полям в DataGridView.
По одному полю фильтрую без проблем, но когда дело доходит до 2х и более появляются проблемы:
при составлении строки фильтра, данные нужно связывать оператором AND, но некоторые поля могут оказаться пустыми и тогда получаем ошибку в тексте фильтра.

Например
C#
1
bindingSource.Filter = "color = 'red' AND name_car LIKE '%Niss%'";
Там может быть еще куча параметров и если один из них будет пустой, то появится сообщение об ошибке
C#
1
bindingSource.Filter = "color = '' AND name_car LIKE '%Niss%'";
или так
C#
1
bindingSource.Filter = "color = 'red' AND ";
В моем случае есть 8 TextBox названных так : txbFilter[имя столбца в запросе]
Т.е. можно составить запрос через foreach
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Перебираем все контролы на expandable panel
foreach (Control ctr in expFilter.Controls)
{
    //Выбираем те, у которых тип TextBox
    if (ctr.GetType() == typeof (TextBox))
    {
        //Выбираем те, которые не пустые
        if (ctr.Text != "")
        {
            //убираем строку txbFilter из названия TextBox и получаем только 
            //название поля, которое можно использовать в запросе
            string nameField = ctr.Name.Remove(0, 9).ToLower(); 
            string valueField = ctr.Text;
        }                      
    }
}
Все мои последующие попытки полный бред) Поэтому прошу помощи в реализации алгоритма фильтрации данных.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2013, 12:37
Ответы с готовыми решениями:

Фильтр по форме по нескольким логическим полям с использованием кнопки Общий фильтр
Здравствуйте! Есть простая таблица и созданная форма. Идея в том, чтобы ставя галки осуществлять...

Фильтр по нескольким полям
Подскажите. Пытаюсь сделать, чтоб как в экселе фильтр можно было ставить в столбцах таблицы DBGrid....

Фильтр по нескольким полям
Привет всем. Использую OracleDataSet - Zayavka. Пишу "последовательный" фильтр, (когда-то был...

Фильтр по форме по нескольким полям
Добрый день. Помогите,пожалуйста, с вопросом фильтра по форме. При фильтре по одному полю все...

6
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.12.2013, 13:53 2
BigOblom, 1) покажи, как ты формируешь строку, например:
C#
1
"color = 'red' AND name_car LIKE '%Niss%'";
2) выбрать все тексбоксы проще так:
C#
1
2
3
4
5
6
foreach (var textbox in expFilter.Controls
                                 .OfType<TextBox>
                                 .Where(tb => !string.IsNullOrEmpty(tb.Text))
{
   // что-то делаем
}
1
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
09.12.2013, 14:38  [ТС] 3
Psilon, с LINQ я пока на "Вы" )
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public bool IsFirst = true;
 
private void txbFilter_TextChanged(object sender, EventArgs e)
{
    try
    {
        string filter = "";
        foreach (Control ctr in expFilter.Controls)
        {
            if (ctr.GetType() == typeof (TextBox))
            {
                if (ctr.Text != "")
                {
                    filter += stringFilter(ctr.Name.Remove(0,9), ctr.Text);
                    IsFirst = false;
                }
            }
        }
        IsFirst = true;
        _bindingSource.Filter = filter;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
 
private string stringFilter(string name, string value)
{
    return IsFirst
               ? string.Format(" {0} = '{1}' ", name, value)
               : string.Format(" AND {0} = '{1}' ", name, value);
}
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.12.2013, 14:50 4
C#
1
2
3
4
5
6
7
8
9
            var pairs = expFilter.Controls.OfType<TextBox>()
                                 .Where(tb => !string.IsNullOrEmpty(tb.Text))
                                 .Select(tb => new KeyValuePair<string, string>(tb.Name.Remove(0, 9), tb.Text))
                                 .ToArray();
            var sb = new StringBuilder(pairs[0].Key + " = " + pairs[0].Value);
            for (int i = 1; i < pairs.Length; i++)
            {
                sb.AppendFormat(" AND {0} = '{1}' ", pairs[i].Key, pairs[i].Value);
            }
но вот это вот
C#
1
tb.Name.Remove(0, 9)
очень криво и не нравится...
1
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
09.12.2013, 14:52  [ТС] 5
Psilon, не придумал пока ничего лучше.
А по поводу этого
C#
1
2
3
4
5
foreach (TextBox txb in expFilter.Controls.OfType<TextBox>.Where(tb => !string.IsNullOrEmpty(tb.Text)))
{
    filter += stringFilter(txb.Name.Remove(0, 9), txb.Text);
    IsFirst = false;
}
пишет
Ошибка 1 "System.Linq.ParallelEnumerable.OfType<TResult>(System.Linq.ParallelQuery)" является "метод", который недопустим в данном контексте
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.12.2013, 14:57 6
BigOblom, бери последний вариант, он же совсем другой, я же в блокнотике имею право ошибиться, написав кусочек linq-кода... )
0
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
09.12.2013, 15:03  [ТС] 7
Psilon, Хорошо. Спасибо) Ушел на MSDN читать.
0
09.12.2013, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2013, 15:03
Помогаю со студенческими работами здесь

Фильтр в Table'e по нескольким полям
Здравствуйте! Плиз хелп! Нужно реализовать фильтрацию записей в таблице (TTable) по...

ADO recordset фильтр по нескольким полям
Здравствуйте. Помогите пожалуйста разобраться. На форме есть несколько полей, по значению которых...

Фильтр в форме по нескольким полям. Ошибка
Здравствуйте, форумчане. Без Вашей помощи не разобраться. Создана Форма.Поиск (фильтрация по...

Фильтр по нескольким полям в одном Edit
Есть Table1, DBGrid1, Edit1 :) Поиск осуществляется хоть сначала, хоть с середины, без учета...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru