katkot_rewsh Ответов: 2

Как я могу связать combobox с другим выбранным значением combobox из разных таблиц базы данных


мне нужно сначала загрузить comboBox1 с данными в базе данных, называемых проводниками из таблицы Condtype написал типа
ведьма успешно справилась

теперь мне нужен еще один comboBox3 быть загруженным, но основанным на первом comboBox1 выбор на основе первого comboBox1 выбранный элемент для фильтрации с ним другой таблицы в той же базе данных называется проводники другая таблица называется проводники заполнены называется ssize и получить значения кроссбондинга в новом combobox3 но не работает ??

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

connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb");
            command = new OleDbCommand();
            connection.Open();
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Condtype";
            dr = command.ExecuteReader();
            while (dr.Read())
            {
                comboBox1.Items.Add(dr["Type"].ToString());

            }
            connection.Close();
                      
            connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb");
            command = new OleDbCommand();
            connection.Open();
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Conductors where Shape = '"+comboBox1.SelectedItem+"'";
            dr = command.ExecuteReader();
            while (dr.Read())
            {
                comboBox3.Items.Add(dr["Ssize"].ToString());

            }
            connection.Close();

2 Ответов

Рейтинг:
9

katkot_rewsh

 public partial class Form1 : Form
    {
        // خاص بالربط مع قاعدة البيانات

        OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Conductors.accdb");
        OleDbCommand command;
        OleDbDataReader dr;
        DataTable dt = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // خاص بربط الكومبو بوكس مع الاكسس

            connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb");
            command = new OleDbCommand();
            connection.Open();
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Condtype";
            dr = command.ExecuteReader();
            while (dr.Read())
            {
                comboBox1.Items.Add(dr["Shape"].ToString());

            }
            connection.Close();

            // خاص بربط الكومبو بوكس مع الاكسس

            connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb");
            command = new OleDbCommand();
            connection.Open();
            command.Connection = connection;
            command.CommandText = "SELECT * FROM Condtype2";
            dr = command.ExecuteReader();
            while (dr.Read())
            {
                comboBox2.Items.Add(dr["Type"].ToString());

            }
            connection.Close();
        
    }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            string sQry = "SELECT * FROM Conductors where Shape = '" + comboBox1.SelectedItem + "' and Type = '" + comboBox2.SelectedItem + "'";
            using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb"))
            {
                connection.Open();
                using (OleDbCommand command = new OleDbCommand(sQry, connection))
                using (OleDbDataReader reader = command.ExecuteReader())
                {
                    dt.Load(reader);
                    comboBox3.DataSource = dt;
                    comboBox3.DisplayMember = "Ssize";
                    comboBox3.ValueMember = "ID";
                }
            }
        }
    }
}


Рейтинг:
16

Maciej Los

Я бы предложил использовать ComboBox1.SelectedIndexChanged Событие (System.Окна.Формы) | Microsoft Docs[^] событие для заполнения ComboBox3. Например:

private void ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
    DataTable dt = new DataTable();
    string sQry = $"SELECT * FROM Conductors where Shape='{comboBox1.SelectedItem.ToString()}';";
    if (sQry=string.Empty) return;
    using(OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=Conductors.accdb"))
        {
            connection.Open();
            using(OleDbCommand command = new OleDbCommand(sQry, connection))
                using(OleDbDataReader reader = command.ExecuteReader())
                {
                     dt.Load(reader);
                     ComboBox3.DataSource = dt;
                     ComboBox3.DisplayMember = "Shape";
                     ComboBox3.ValueMember = "ShapeId";
                }
        }
}


Для получения более подробной информации, пожалуйста, смотрите:
комбинированный список.Свойство Источника Данных (System.Окна.Формы) | Microsoft Docs[^]
Элементе управления listcontrol.Свойство DisplayMember (System.Окна.Формы) | Microsoft Docs[^]
Элементе управления listcontrol.Свойство ValueMember (Системы.Окна.Формы) | Microsoft Docs[^]


katkot_rewsh

Спасибо Мацей за ваше решение

теперь мне нужно сделать его более сложным, используя 3 combobox, не могли бы вы сказать мне, где это неправильно в приведенном ниже коде ?

строка sQry = "SELECT * FROM Conductors where Type = ('"+ Convert.Метод toString(поле combobox1.Элемент)+"') и формы = ('" + преобразование.Метод toString(comboBox2.Элемент) + "'),";

Maciej Los

Основываясь на этом фрагменте кода - я не могу.