Нужно вывести соответствующее значение в DataGridView comboBox

У меня есть БД и 2 таблицы

CREATE TABLE Банк (
    ID_Банка INT PRIMARY KEY,
    Название_банка VARCHAR(255) UNIQUE NOT NULL,
    Код_банка VARCHAR(9) UNIQUE NOT NULL,
    Адрес_банка VARCHAR(255) NOT NULL
);       
CREATE TABLE Счет (
    ID_Счета INT PRIMARY KEY,
    ID_Банка INT,
    Номер_счета VARCHAR(28) UNIQUE NOT NULL,
    Вид_счета VARCHAR(50) NOT NULL,
    ФИО_владельца_счета VARCHAR(255) NOT NULL,
    Состояние_счета VARCHAR(50) NOT NULL,
    Дата DATE NOT NULL,
    Наличие_кредита BOOLEAN NOT NULL,
    Сумма_кредита DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (ID_Банка) REFERENCES Банк (ID_Банка)
);

Я хочу вывести их в DataGridView, у меня получается вывести все и заполнить ComboBox, но я не могу вывести соответствующее значение, то есть, чтобы сразу в ComboBox было выбрано соответствующее значение (Название банка)

private void PopulateDataGridView3()
{
    string query = "SELECT * FROM Счет";
    DataTable dataTable = new DataTable();

    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, connector.getConnection()))
    {
        adapter.Fill(dataTable);
    }

    DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn();
    comboBoxColumn.HeaderText = "ID_Банка";
    comboBoxColumn.Name = "ID_Банка";

    string bankQuery = "SELECT ID_Банка, Название_банка FROM Банк";
    DataTable bankDataTable = new DataTable();

    using (MySqlDataAdapter bankAdapter = new MySqlDataAdapter(bankQuery, connector.getConnection()))
    {
        bankAdapter.Fill(bankDataTable);
    }

    foreach (DataRow row in bankDataTable.Rows)
    {
        comboBoxColumn.Items.Add(row["ID_Банка"].ToString() + ": " + row["Название_банка"].ToString());
    }

    // Добавление ComboBox в dataGridView3
    dataGridView3.Columns.Add(comboBoxColumn);

    dataGridView3.DataSource = dataTable;

    
    foreach (DataGridViewRow row in dataGridView3.Rows)
    {
        int bankID = Convert.ToInt32(row.Cells["ID_Банка"].Value);

        foreach (DataRow bankRow in bankDataTable.Rows)
        {
            if (bankID == Convert.ToInt32(bankRow["ID_Банка"]))
            {
                row.Cells["ID_Банка"].Value = bankID + ": " + bankRow["Название_банка"].ToString();
                break;
            }
        }
    }
}

Ответы (1 шт):

Автор решения: Alexander Petrov

Как я понимаю, вы хотите, чтобы комбобокс был заполнен данными банков.

private void PopulateDataGridView3()
{
    var dataSet = new DataSet();

    string accountQuery = "SELECT * FROM Счет";
    string bankQuery = "SELECT ID_Банка, Название_банка FROM Банк";

    using (var adapter = new SqlDataAdapter(accountQuery, _connectionString))
    {
        adapter.Fill(dataSet, "Счет");
    }
    using (var bankAdapter = new SqlDataAdapter(bankQuery, _connectionString))
    {
        bankAdapter.Fill(dataSet, "Банк");
    }

    var comboBoxColumn = new DataGridViewComboBoxColumn();
    comboBoxColumn.HeaderText = "Банк";
    comboBoxColumn.Name = "Bank";

    comboBoxColumn.DataPropertyName = "ID_Банка";
    comboBoxColumn.DisplayMember = "Название_банка";
    comboBoxColumn.ValueMember = "ID_Банка";
        
    var accountBindingSource = new BindingSource(dataSet, "Счет");
    var bankBindingSource = new BindingSource(dataSet, "Банк");
    comboBoxColumn.DataSource = bankBindingSource;
    dataGridView3.DataSource = accountBindingSource;

    dataGridView3.Columns.Add(comboBoxColumn);
    comboBoxColumn.DisplayIndex = 1;
}

Используем только привязку данных (data binding), не нужно вручную работать со строками и ячейками грида.

Обратите внимание на новые заданные свойства комбобокса.

P.S. Я использовал для теста Sql Server, но это меняет лишь используемый DataAdapter.

→ Ссылка