Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по параметрам 
:(
    Опции темы
Legolas
Дата 8.7.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Возникла небольшая проблемка при написании одного  приложения: пытаюсь наладить поиск в таблице dataGridView по различным параметрам. То есть в таблице находится фильмы со следующими свойствами:  Название Жанр Размер Длительность. Создаю комбобоксы к с параметрами поиска - например, искать по Жанру. Проблема состоит в том, что при выборе нескольких параметров поиска одновременно, в таблицу выводятся все фильмы хоть как-то попадающие по критерию
, а хотелось бы чтобы происходило какое-то "отсеивание". 

Пример:

Ищу фильмы Комедия, DVD5
Выводятся все фильмы с жанром комедии и все фильмы DVD5 (включая другие жанры),  а хотелось бы среди комедий найти все DVD5, или наоборот. 

Есть ли какие-нибудь идее по поводу. 

Спасибо.
PM MAIL   Вверх
Idsa
Дата 8.7.2007, 23:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



[Б]Леголас[/Б], код в студию!
А вообще поиск удобно делать при помощи метода Select класса DataTable.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Legolas
Дата 8.7.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Код

string[] parts = new string[6];
            string str = richTextBox1.Text;
            string[] baza = File.ReadAllLines("base.txt");
            char[] seps = { '*' };

            try
            {
                for (int i = 0; i < baza.Length; i++)
                {
                    parts = baza[i].Split(seps);
                    for(int a = 0; a < parts.Length; a++)
                    {
                        if (((parts[1].Contains(str)) && (str != "")) || (parts[2].Contains(cmb1) && (cmb1 != "")) || (parts[3].Contains(cmb4) && (cmb4 != "")) || (parts[4].Contains(cmb3) && (cmb3 != "")) || (parts[5].Contains(cmb2) && (cmb2 != "")))
                        {                           
                                dataGridView1.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);
                                richTextBox2.Enabled = true;
                                richTextBox3.Enabled = true;
                                richTextBox4.Enabled = true;
                                richTextBox5.Enabled = true;
                                richTextBox6.Enabled = true;

                                richTextBox2.Visible = true;
                                richTextBox3.Visible = true;
                                richTextBox4.Visible = true;
                                richTextBox5.Visible = true;
                                richTextBox6.Visible = true;

                                label6.Visible = true;

                                comboBox1.Visible = false;
                                comboBox2.Visible = false;
                                comboBox3.Visible = false;
                                comboBox4.Visible = false;


                                richTextBox1.Enabled = false;
                                button1.Enabled = false;


                                richTextBox4.Text = parts[2];
                                richTextBox5.Text = parts[3];
                                richTextBox3.Text = parts[4];
                                richTextBox6.Text = parts[5];
                                richTextBox2.Text = parts[6];
                                break;
                         }

                         else
                         {

                                dataGridView1.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);
                                richTextBox2.Enabled = true;
                                richTextBox3.Enabled = true;
                                richTextBox4.Enabled = true;
                                richTextBox5.Enabled = true;
                                richTextBox6.Enabled = true;

                                richTextBox2.Visible = true;
                                richTextBox3.Visible = true;
                                richTextBox4.Visible = true;
                                richTextBox5.Visible = true;
                                richTextBox6.Visible = true;

                                label6.Visible = true;

                                comboBox1.Visible = false;
                                comboBox2.Visible = false;
                                comboBox3.Visible = false;
                                comboBox4.Visible = false;


                                richTextBox1.Enabled = false;
                                button1.Enabled = false;


                                richTextBox4.Text = parts[2];
                                richTextBox5.Text = parts[3];
                                richTextBox3.Text = parts[4];
                                richTextBox6.Text = parts[5];
                                richTextBox2.Text = parts[6];
                                break;
                            }
                        }                     
                    }                    
                }
                if ((dataGridView1[0, 1] == null) || (str == null))
                {
                    DialogResult result = MessageBox.Show(
                 "Фильма нет в базе. Вам необходимо сначала его добавить.",
                 "Внимание!",
                 MessageBoxButtons.OK);
                    if (result == DialogResult.OK) return;
                }
            }

            catch (ArgumentOutOfRangeException) 
            {
                {
                    DialogResult result = MessageBox.Show(
                    "Фильма нет в базе. Вам необходимо сначала его добавить.",
                    "Внимание!",
                    MessageBoxButtons.OK);
                    if (result == DialogResult.OK) return;     
                }
            }

PM MAIL   Вверх
sTa1kEr
Дата 9.7.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: нет
Всего: 146



Legolas, достаточно инвертировать логические операнды
Код

if (((str != "") && (parts[1].Contains(str))) && ((cmb1 == "") || parts[2].Contains(cmb1)) && ((cmb4 == "") || parts[3].Contains(cmb4)) && ((cmb3 == "") || parts[4].Contains(cmb3)) && ((cmb2 != "") || parts[5].Contains(cmb2)))

Лучше помещать проверку на пустую строку в начало, что бы не делать в пустую поиск по массиву.
PM MAIL   Вверх
Legolas
Дата 9.7.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



sTa1kEr, насчет пустой строки - да, но при инвертировании эффект остается таким же - выводятся куча фильмов подходящих хотя бы одному критерию, в то же время, другие критерии этих фильмов противоречат поисковому запросу. 
PM MAIL   Вверх
sTa1kEr
Дата 9.7.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: нет
Всего: 146



Legolas, подождите... в превый раз не внимательно посмотрел.
1. У вас в коде слишком много закрывающихся фигурных скобок.
2. 
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                    for(int a = 0; a < parts.Length; a++)

Зачем этот цикл? Вы же итак сразу по всем строкам ищите?
3.
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                         else
                         {
                                dataGridView1.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);

Т.е. если условие не прошло, то всеравно добавляете строку в грид? Тогда у вас должны всегда выводится все фильмы.
4.
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                if ((dataGridView1[0, 1] == null) || (str == null))

Имхо лучше проверять колличество строк в гриде: if (dataGridView1.Rows.Count == 0)
PM MAIL   Вверх
Legolas
Дата 9.7.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Цитата(sTa1kEr @ 9.7.2007,  20:04)
Legolas, подождите... в превый раз не внимательно посмотрел.
1. У вас в коде слишком много закрывающихся фигурных скобок.
2. 
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                    for(int a = 0; a < parts.Length; a++)

Зачем этот цикл? Вы же итак сразу по всем строкам ищите?
3.
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                         else
                         {
                                dataGridView1.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);

Т.е. если условие не прошло, то всеравно добавляете строку в грид? Тогда у вас должны всегда выводится все фильмы.
4.
Цитата(Legolas @  8.7.2007,  23:40 Найти цитируемый пост)
                if ((dataGridView1[0, 1] == null) || (str == null))

Имхо лучше проверять колличество строк в гриде: if (dataGridView1.Rows.Count == 0)

1. со скобками всё в порядке
2. если ты внимательно смотрел код, то там сначала разбиваю на строки,а затем на отдельные элементы строк. массив parts содержит элементы строки.
3. нет не должны, так как туда выводится фильм если происходил поиск чётко по названию, а не по параметрам.
4. можно и так

И всё-таки вопрос остается не решенным - как наладить поиск по параметрам?
PM MAIL   Вверх
Naum
Дата 13.7.2007, 18:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Полностью согласен со вторым постом sTa1kErа.
1. 8 открывающих скобок, 9 закрывающих. 
2. Так я и не понял зачем нужна переменная a. Или ты просто хочешь повторить поиск столько же раз, сколько и категорий. Но зачем? Ведь все категории ты пытаешься проверить при первом же проходе в длинном булевом выражении.
3. Для наглядности сделаем следующее:
Код

private bool IsRecordMatchToRequest()
{
   return ((parts[1].Contains(str)) && (str != "")) || (parts[2].Contains(cmb1) && (cmb1 != "")) || (parts[3].Contains(cmb4) && (cmb4 != "")) || (parts[4].Contains(cmb3) && (cmb3 != "")) || (parts[5].Contains(cmb2) && (cmb2 != ""));
}

Это длинное логическое выражение неверно. Как поправить напишу завтра, извини. Далее
Код

private void DisplayInfo()
{
dataGridView1.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]);
                                richTextBox2.Enabled = true;
                                richTextBox3.Enabled = true;
                                richTextBox4.Enabled = true;
                                richTextBox5.Enabled = true;
                                richTextBox6.Enabled = true;
                                richTextBox2.Visible = true;
                                richTextBox3.Visible = true;
                                richTextBox4.Visible = true;
                                richTextBox5.Visible = true;
                                richTextBox6.Visible = true;
                                label6.Visible = true;
                                comboBox1.Visible = false;
                                comboBox2.Visible = false;
                                comboBox3.Visible = false;
                                comboBox4.Visible = false;
                                richTextBox1.Enabled = false;
                                button1.Enabled = false;
                                richTextBox4.Text = parts[2];
                                richTextBox5.Text = parts[3];
                                richTextBox3.Text = parts[4];
                                richTextBox6.Text = parts[5];
                                richTextBox2.Text = parts[6];
                                break;
}

И теперь смотрим, какой у нас получился if
Код

if (IsRecordMatchToRequest())
{
   DisplayInfo();
}
else
{
   DisplayInfo();
}

Теперь видно, что DisplayInfo() выполняется в любом случае?
4. Не можно, а нужно. Потому что именно из-за того, что ты неправильно делаешь и вылетает ArgumentOutOfRangeException, которую ты же сам потом ловишь.
[/code]


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 13.7.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Legolas, ищем ошибку в своём коде.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.