Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 1
Регистрация: 13.05.2012
Сообщений: 7
1

Как эффективней сформировать строку для свойства DataView.RowFilter

29.05.2012, 03:40. Показов 3518. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Подскажите как эффективней сформировать строку для свойства DataView.RowFilter?
Суть проблемы:
На форме поиска в БД имеются несколько компонентов из которых пользователь выбирает по 1 значению. Выбраны могут быть от 1 до нескольких значений (заранее неизвестно, сколько и какие именно). При выборе какого-то значения формируется строка, вида:
строка1 = "(Столбец = 'Значение')";
Также, есть возможность выбрать логическую операцию AND или OR, после чего формируется еще одна строка, вида:
strLogic = " AND "; или strLogic = " OR "; в зависимости от выбора.
Вопрос: как это все можно склеить в одну строку, чтобы к примеру, если выбраны 4 параметра, то конечная строка принимала вид:
strFilter = строка1 + strLogic + строка2 + strLogic + строка3 + strLogic + строка4;

Вот фрагмент кода:
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
34
35
36
37
38
39
40
            DataTable dt = new DataTable();
            DataView dv = new DataView();
            da.Fill(dt);
            dv = dt.DefaultView;
            string filter = "";
            string strEquipment = "";
            string strNumber = "";
            string strDate = "";
            string strService = "";
            string strAuthor = "";
            string strMaster = "";
            string strWorkshop = "";
            string strClose = "";
            string strCancel = "";
            string strLogic = "";
            if (comboBoxEquipment.Text != "")
                strEquipment = "(" + "Оборудование = " + "'" + comboBoxEquipment.Text + "'" + ")";
            if (textBoxNumberStart.Text != "" && textBoxNumberFinish.Text != "")
                strNumber = "(" + "Номер >= " + "'" + textBoxNumberStart.Text + "'" + " AND " + "Номер <= " + "'" + textBoxNumberFinish.Text + "'" + ")";
            if (Convert.ToString(dateTimePickerStart.Value) != "" && Convert.ToString(dateTimePickerFinish.Value) != "")
                strDate = "(" + "Дата >= " + "'" + Convert.ToString(dateTimePickerStart.Value) + "'" + " AND " + "Дата <= " + "'" + Convert.ToString(dateTimePickerFinish.Value) + "'" + ")";
            if (comboBoxTypeService.Text != "")
                strService = "(" + "[Тип обслуживания] = " + "'" + comboBoxTypeService.Text + "'" + ")";
            if (comboBoxAuthor.Text != "")
                strAuthor = "(" + "[Заявку подал] = " + "'" + comboBoxAuthor.Text + "'" + ")";
            if (comboBoxMaster.Text != "")
                strMaster = "(" + "Мастер = " + "'" + comboBoxMaster.Text + "'" + ")";
            if (comboBoxWorkshop.Text != "")
                strWorkshop = "(" + "Цех = " + "'" + comboBoxWorkshop.Text + "'" + ")";
            if (checkBoxClose.Checked)
                strClose = "(Статус = 'Закрыта')";
            if (checkBoxCancel.Checked)
                strCancel = "(Статус = 'Отменена')";
            if (radioButtonAND.Checked)
                strLogic = " AND ";
            else
                strLogic = " OR ";
            
            filter = ???
            dv.RowFilter = filter;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2012, 03:40
Ответы с готовыми решениями:

Отображение данных DataView RowFilter, в которых есть расхождения
Добрый день. Возникла потребность отобразить в гриде по средствам DataView данные в которых есть...

Как через командную строку открыть диалоговое окно "Свойства" для файла или папки?
Здравствуйте, подскажите как через командную строку открыть диалоговое окно &quot;Свойства&quot; для файла...

Для заданной строки сформировать новую строку, состоящую только из цифр, входящих в начальную строку
Функция записи и тестирования, которая для заданной строки формирует новую строку, состоящую только...

ECS nForce4-A754. Как эффективней увеличить оперативку ?
Есть материнка ECS nForce4-A754 : Socket S754 Поддерживаемые процессоры AMD Athlon 64/Sempron ...

2
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
30.05.2012, 03:33 2
Вопрос еще актуальный?
Наверное это не самая лучшая реализация построения строки. Но в твоем случае это может выглядеть так:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
            string filter = "";
            string strEquipment = "";
            string strNumber = "";
            string strDate = "";
            string strService = "";
            string strAuthor = "";
            string strMaster = "";
            string strWorkshop = "";
            string strClose = "";
            string strCancel = "";
            string strLogic = "";
            //Перенеси проверку логической операции на начало так как мы должны изначально знать чем объеденять условия
            //На каждом if(если выполняеться) ты будешь дополнять строку условием плюс логическое AND или OR
            if (radioButtonAND.Checked) 
                strLogic = " AND ";
            else  
                strLogic = " OR ";
            if (comboBoxEquipment.Text != "")
            {
                strEquipment = string.Format("(Оборудование = '{0}')", comboBoxEquipment.Text);
                filter += strEquipment + strLogic;
            }
            if (textBoxNumberStart.Text != "" && textBoxNumberFinish.Text != "")
            {
                strNumber = string.Format("(Номер >= '{0}' AND Номер <= '{1}')", textBoxNumberStart.Text, textBoxNumberFinish.Text);
                filter += strNumber + strLogic;
            }
            if (Convert.ToString(dateTimePickerStart.Value) != "" && Convert.ToString(dateTimePickerFinish.Value) != "")
            {
                strDate = string.Format("(Дата >= '{0}' AND Дата <= '{1}')", Convert.ToString(dateTimePickerStart.Value), Convert.ToString(dateTimePickerFinish.Value));
                filter += strDate + strLogic;
            }
            if (comboBoxTypeService.Text != "")
            {
                strService = string.Format("([Тип обслуживания] = '{0}')", comboBoxTypeService.Text);
                filter += strService + strLogic;
            }
            if (comboBoxAuthor.Text != "")
            {
                strAuthor = string.Format("([Заявку подал] = '{0}')", comboBoxAuthor.Text);
                filter += strAuthor + strLogic;
            }
            if (comboBoxMaster.Text != "")
            {
                strMaster = string.Format("(Мастер = '{0}')", comboBoxMaster.Text);
                filter += strMaster + strLogic;
            }
            if (comboBoxWorkshop.Text != "")
            {
                strWorkshop = string.Format("(Цех = '{0}')", comboBoxWorkshop.Text);
                filter += strWorkshop + strLogic;
            }
            if (checkBoxClose.Checked)
            {
                strClose = "(Статус = 'Закрыта')";
                filter += strClose + strLogic;
            }
            if (checkBoxCancel.Checked)
            {
                strCancel = "(Статус = 'Отменена')";
                filter += strCancel + strLogic;
            }
            //При таком подходе в конце твоей строки последним окажеться " AND " или " OR " - это нужно удалить
            if (filter.EndsWith(strLogic)) filter = filter.Remove(filter.Length - strLogic.Length, strLogic.Length);
 
            dv.RowFilter = filter;
Я не компилировал, но думаю примерно так. Посмотри пошагово как будет заполняться твоя строка.
1
0 / 0 / 1
Регистрация: 13.05.2012
Сообщений: 7
30.05.2012, 11:51  [ТС] 3
Цитата Сообщение от mbigun Посмотреть сообщение
Вопрос еще актуальный?
Спасибо!
Я, вчера не дождавшись ответа (время поджимает - 5го защита), сделал формирование строки с помощью ArrayList:
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
ArrayList myAL = new ArrayList();
                if (strEquipment != "")
                    myAL.Add(strEquipment);
                if (strNumber != "")
                    myAL.Add(strNumber);
                if (strDate != "")
                    myAL.Add(strDate);
                if (strService != "")
                    myAL.Add(strService);
                if (strAuthor != "")
                    myAL.Add(strAuthor);
                if (strMaster != "")
                    myAL.Add(strMaster);
                if (strWorkshop != "")
                    myAL.Add(strWorkshop);
                if (strClose != "")
                    myAL.Add(strClose);
                if (strCancel != "")
                    myAL.Add(strCancel);
                if (myAL.Count > 1)
                    for (int i = 0; i < myAL.Count; i++)
                    {
                        if (i % 2 != 0)
                            myAL.Insert(i, strLogic);
                    }
                if (myAL.Count != 0)
                    for (int i = 0; i < myAL.Count; i++)
                    {
                        filter += Convert.ToString(myAL[i]);
                    }
                dv.RowFilter = filter;
                requestListDataGridView.DataSource = dv;
0
30.05.2012, 11:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2012, 11:51
Помогаю со студенческими работами здесь

RowFilter и как им пользоваться
Добрый вечер! Есть табличка datatable содержащая 3 столбика (num int, fio varchar, count int)....

Как эффективней всего создавать деревья,камни и другие не стандартные объекты на сцене
...как эффективней всего создавать деревья,камни и другие не стандартные объекты на сцене .

Как вытянуть в текстовую строку название Свойства (Property)?
Задача в том, что бы вытянуть из имеющихся Свойств название и передать их в конструктор другого...

Как фильтровать элементы по вхождению значения свойства в строку?
такой вот фильтр выбирает элементы, имена которых начинаются со string: Код $arFilter =...


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

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