Marc-IT Ответов: 1

Фильтрация данных из comboboxs


У меня есть приложение winforms на C# с несколькими комбо-боксами. эти комбинированные блоки отображают данные из базы данных SQL. Я могу заставить comboboxes отображать данные в listview, но то, что я хочу, - это фильтровать данные. Например, пользователь выбирает значение в combobox1, и результаты появляются, но когда он выбирает значение в combobox 2, будут отображаться только соответствующие значения с правилами из combobox1. это похоже на создание фильтра, но я не могу понять, как я могу взаимодействовать между комбо-боксами. Код у меня есть:

Что я уже пробовал:

РЕДАКТИРОВАТЬ:
string combo1value = desempenho.Text;
            string combo2value = valu.Text;
            string combo3value = fsolar.Text;
            string combo4value = select.Text;
            string combo5value = compo.Text;


            string query = "select [desc],[enchimento],[compo] from vidros  ";

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;

            if (combo1value != "")
            {
                query += " where desempenho = @emp ";
                cmd.Parameters.Add("@emp", SqlDbType.NVarChar).Value = combo1value;
            }
            if (combo2value != "")
            {
                if (combo2value == "") query += " where valu = @emp2 ";
            
                    query += " and  valu = @emp2 ";
                cmd.Parameters.Add("@emp2", SqlDbType.NVarChar).Value = combo2value;
            }
            if (combo3value != "")
            {
                if (combo3value == "") query += " where fs = @emp3 ";
               
                    query += " and  fs = @emp3 ";
                cmd.Parameters.Add("@emp3", SqlDbType.NVarChar).Value = combo3value;
            }
            if (combo4value != "")
            {
                if (combo4value == "") query += " where sel = @emp4 ";
        
                    query += " and  sel = @emp4 ";
                cmd.Parameters.Add("@emp4", SqlDbType.NVarChar).Value = combo4value;
            }
            if (combo5value != "")
            {
                if (combo5value == "") query += " where fs = @emp5 ";
                else
                    query += " and  compo = @emp5 ";
                cmd.Parameters.Add("@emp5", SqlDbType.NVarChar).Value = combo5value;
            }
            cmd.CommandText = query;
            cmd.CommandType = CommandType.Text;
            SqlDataAdapter sda = new SqlDataAdapter(cmd);


            DataTable DTT = new DataTable();
            sda.Fill(DTT);
            listView1.Items.Clear();
            for (int i = 0; i < DTT.Rows.Count; i++)
            {
                DataRow dr = DTT.Rows[i];
                ListViewItem listitem = new ListViewItem(dr["desc"].ToString());
                listitem.SubItems.Add(dr["enchimento"].ToString());
                listitem.SubItems.Add(dr["compo"].ToString());
                listView1.Items.Add(listitem);
            }
        }

NotPolitcallyCorrect

Ваш " вопрос "*очень* неясен мне, но это почти звучит так, как будто вы хотите просто изменить свой обработчик событий" combobox2 " (какой бы он ни был), чтобы включить данные combobox1. Я не понимаю, в чем тут проблема и почему вы не можете ее решить.

Marc-IT

Это сложно объяснить.
Например, у меня есть 2 comboboxes, 1 из них загружает марки двигателей, второй загружает марки автомобилей при загрузке данных в listview должны появляться только двигатели, совместимые с выбранным автомобилем в combobox2.
Извините, я не могу найти другого способа объяснить

NotPolitcallyCorrect

Ладно, я все еще не понимаю, в чем тут проблема. Мне кажется, что вам просто нужно добавить предложение AND к вашему запросу.

1 Ответов

Рейтинг:
10

Karthik_Mahalingam

попробовать это

private void desempenho_SelectedIndexChanged(object sender, EventArgs e)
        {
            FillData();
        }

       
        private void valu_SelectedIndexChanged(object sender, EventArgs e)
        {
            FillData();
        }

        private void FillData()
        {
            string combo1value = desempenho.Text;
            string combo2value = valu.Text;
            string query = "select [desc],[enchimento],[compo] from vidros  ";
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand.Connection = con;

            if (combo1value != "")
            {
                query += " where desempenho = @emp ";
                sda.SelectCommand.Parameters.Add("@emp", SqlDbType.NVarChar).Value = combo1value;


            }
            if (combo2value != "")
            {
                if (combo2value == "") query += " where valu = @emp2 ";
                else
                    query += " and  valu = @emp2 ";
                sda.SelectCommand.Parameters.Add("@emp2", SqlDbType.NVarChar).Value = combo2value;
            }
            sda.SelectCommand.CommandText = query;

            DataTable DTT = new DataTable();

            sda.Fill(DTT);
            listView1.Items.Clear();
            for (int i = 0; i < DTT.Rows.Count; i++)
            {
                DataRow dr = DTT.Rows[i];
                ListViewItem listitem = new ListViewItem(dr["desc"].ToString());
                listitem.SubItems.Add(dr["enchimento"].ToString());
                listitem.SubItems.Add(dr["compo"].ToString());
                listView1.Items.Add(listitem);
            }
        }


Marc-IT

Спасибо за помощь,
Я получаю ошибку в строке: ПДД.Команды selectcommand.Connection = con; ошибка: ссылка на объект не была определена как экземпляр объекта

Karthik_Mahalingam

попробовать это


            string combo1value = desempenho.Text;
            string combo2value = valu.Text;
            string query = "select [desc],[enchimento],[compo] from vidros  ";
          
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            
            if (combo1value != "")
            {
                query += " where desempenho = @emp ";
                cmd.Parameters.Add("@emp", SqlDbType.NVarChar).Value = combo1value;


            }
            if (combo2value != "")
            {
                if (combo2value == "") query += " where valu = @emp2 ";
                else
                    query += " and  valu = @emp2 ";
                cmd.Parameters.Add("@emp2", SqlDbType.NVarChar).Value = combo2value;
            }
            cmd.CommandText= query;
            cmd.CommandType= CommandType.Text;
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
             
           
             

            DataTable DTT = new DataTable();
.
.
.


Marc-IT

Удивительно, вот и все :D Спасибо
Еще один вопрос: если бы у меня было еще 3 комбо-бокса после этих 2, Можно ли было бы использовать тот же метод?

Karthik_Mahalingam

крутой,
да, до n-го числа элементов управления.

Marc-IT

Извините, что беспокою вас, но один последний вопрос, я отредактировал свой пост.
Я воспроизвел код, но мне кажется, что что-то не так, не могли бы вы мне помочь, пожалуйста? и еще раз спасибо за вашу доброту

Karthik_Mahalingam

ладно

Karthik_Mahalingam

string query = "select [desc],[enchimento],[compo] from vidros  where 1=1 ";
            string queryWhere ="";
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand.Connection = con;

            if (combo1value != "")
            {
                queryWhere += " and desempenho = @emp ";
                sda.SelectCommand.Parameters.Add("@emp", SqlDbType.NVarChar).Value = combo1value; 
            }
            if (combo2value != "")
            {
                 queryWhere+=  " and valu = @emp2  ";
                sda.SelectCommand.Parameters.Add("@emp2", SqlDbType.NVarChar).Value = combo2value;
            }
            if (combo3value != "")
            {
                queryWhere += " and column1 = @emp3  ";
                sda.SelectCommand.Parameters.Add("@emp3", SqlDbType.NVarChar).Value = combo3value;
            }
            if (combo4value != "")
            {
                queryWhere += " and column2 = @emp4  ";
                sda.SelectCommand.Parameters.Add("@emp4", SqlDbType.NVarChar).Value = combo4value;
            }
            if (combo5value != "")
            {
                queryWhere += " and column3 = @emp5  ";
                sda.SelectCommand.Parameters.Add("@emp5", SqlDbType.NVarChar).Value = combo5value;
            } 

            sda.SelectCommand.CommandText = query + queryWhere;

            DataTable DTT = new DataTable();


измените имена столбцов в запросе

Marc-IT

Привет,
Прежде всего, большое спасибо за помощь.
к сожалению, теперь я получаю ошибку. В строке:ПДД.Команды selectcommand.Подключение = кон;
Ссылка на объект не была определена как экземпляр объекта.
не могли бы вы помочь, пожалуйста?

Спасибо снова

Karthik_Mahalingam

  SqlConnection con = new SqlConnection (); 

            string query = "select [desc],[enchimento],[compo] from vidros  where 1=1 ";
            string queryWhere = "";
            SqlDataAdapter sda = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            sda.SelectCommand = cmd;

            if (combo1value != "")
            {
                queryWhere += " and desempenho = @emp ";
                sda.SelectCommand.Parameters.Add("@emp", SqlDbType.NVarChar).Value = combo1value;
            }
            if (combo2value != "")
            {
                queryWhere += " and valu = @emp2  ";
                sda.SelectCommand.Parameters.Add("@emp2", SqlDbType.NVarChar).Value = combo2value;
            }
            if (combo3value != "")
            {
                queryWhere += " and column1 = @emp3  ";
                sda.SelectCommand.Parameters.Add("@emp3", SqlDbType.NVarChar).Value = combo3value;
            }
            if (combo4value != "")
            {
                queryWhere += " and column2 = @emp4  ";
                sda.SelectCommand.Parameters.Add("@emp4", SqlDbType.NVarChar).Value = combo4value;
            }
            if (combo5value != "")
            {
                queryWhere += " and column3 = @emp5  ";
                sda.SelectCommand.Parameters.Add("@emp5", SqlDbType.NVarChar).Value = combo5value;
            }

            sda.SelectCommand.CommandText = query + queryWhere;

            DataTable DTT = new DataTable();

Karthik_Mahalingam

string query = " select [desc], [enchimento], [compo] from vidros where 1=1 ";
строки queryWhere = "";
SqlDataAdapter sda = новый SqlDataAdapter();
Команда sqlcommand команду cmd = новый sqlcommand, который();
УМК.Подключение = кон;
АСД.Команды selectcommand = ЦМД;

if (combo1value != "")
{
queryWhere + = " и desempenho = @emp ";
АСД.Команды selectcommand.Parameters. Add ("@emp", SqlDbType.NVarChar).Значение = combo1value;
}
если (combo2value != "")
{
queryWhere + = " и valu = @emp2 ";
АСД.Команды selectcommand.Parameters. Add ("@emp2", SqlDbType.NVarChar).Значение = combo2value;
}
если (combo3value != "")
{
queryWhere + = " и column1 = @emp3 ";
АСД.Команды selectcommand.Parameters. Add ("@emp3", SqlDbType.NVarChar).Значение = combo3value;
}
если (combo4value != "")
{
queryWhere + = " и column2 = @emp4 ";
АСД.Команды selectcommand.Parameters. Add ("@emp4", SqlDbType.NVarChar).Значение = combo4value;
}
если (combo5value != "")
{
queryWhere + = " и column3 = @emp5 ";
АСД.Команды selectcommand.Parameters. Add ("@emp5", SqlDbType.NVarChar).Значение = combo5value;
}

АСД.Команды selectcommand.CommandText = query + queryWhere;

DataTable DTT = новый DataTable();

Marc-IT

Идеальный.
Еще раз спасибо, ты спасаешь мне жизнь ;)

Karthik_Mahalingam

добро пожаловать :)

Marc-IT

Привет еще раз,
Извините, что снова беспокою. Но только простой вопрос.
С вашей помощью я получил фильтрацию, отлично работающую с комбобоксами.
Но можно ли заполнить listview при загрузке формы всеми данными из таблицы типа "select * from vidros", чтобы, если пользователь захочет отфильтровать данные, он мог использовать comboboxes? на данный момент listview отображает данные только тогда, когда я выбираю элемент.
Спасибо снова

Karthik_Mahalingam

да возможно

Marc-IT

Круто,
Im собираюсь попробовать.
спасибо снова

Karthik_Mahalingam

хорошо, я буду спать ... ГН