Измените DataGridViewColumn на DataGridViewComboBoxColumn в привязанном DataGridView

У меня есть DataGridView, привязанный к DataTable, и я использую SQLiteDataAdapter для обновления одной базы данных SQLite. Я пытаюсь сделать один из столбцов DataGridViewComboBoxColumn, но, несмотря на то, что я могу размещать на нем элементы и изменять значения его ячеек, я больше не могу обновлять его через DataAdapter.

Я делаю это после загрузки DataGridView:

DataGridViewComboBoxColumn cbCol = new DataGridViewComboBoxColumn();
dataGridView1.Columns.Insert(2, cbCol);
dataGridView1.Columns[2].HeaderText = dataGridView1.Columns[3].HeaderText;
dataGridView1.Columns[3].Visible = false;

string[] cbList = new[] {"item1","item2"};

foreach (string str in cbList)
{
    cbCol.Items.Add(str);
}

for (int i = 0 ; i<= dataGridView1.Rows.Count - 1; i++)
{
    dataGridView1.Rows[i].Cells[2].Value = dataGridView1.Rows[i].Cells[3].Value;
}

Проблема в том, что ComboBoxColumn не привязан к DataTable, и я должен проверить наличие изменений и изменить скрытый столбец перед запуском DataAdapter.Update.

Есть ли способ избежать этого? Идеальный сценарий будет примерно таким:

    private void dataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
    {
       if (columnadded.headertext == "xxx")
       {
           //Then this is column is the same but in a ComboBox format.
           //The ComboBoxColumn, when added, must show the same values and have 
           //the same binding as if if was the regular column.
       }
    }

person Gonzalo Faus    schedule 04.03.2014    source источник


Ответы (2)


Создайте DataGridViewComboBoxColum, добавьте его в сетку и свяжите данные. Если вы установите для свойства DataPropertyName вашего столбца идентификатор столбца db, тогда, когда ваши данные будут привязаны, этот столбец данных будет привязан к вашему столбцу сетки. DataGridView автоматически сгенерирует другие столбцы (если вы установите AutoGenerateColumns=true). Привяжите второй источник данных к самому столбцу со списком.

DataGridViewComboBoxColumn col1 = new DataGridViewComboBoxColumn ();
col1.Name = //name of the column
col1.HeaderText = //header text of the column
col1.DataPropertyName = //db column id
col1.DataSource = // datasource for combo
dataGridView1.Columns.Add(col1);

dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = // your datasource
person Junaith    schedule 05.03.2014
comment
Спасибо, мужик, это именно то, что мне нужно. Мне не хватало DataPropertyName! - person Gonzalo Faus; 06.03.2014

у меня была похожая проблема, мне пришлось добавить

col1.DisplayMember = "number"; //column name in source table for col1

к вышеуказанному решению, а затем это сработало.

person Matthew    schedule 06.02.2018