Для этого есть странное решение.
По умолчанию создайте столбец как TextBox.
Обработка события щелчка или ввода ячейки.
Если ColumnIndex совпадает, преобразуйте тип столбца в ComboBox и установите элементы.
Как только событие выхода из ячейки срабатывает из индекса соответствующего столбца, преобразуйте его обратно в текстовое поле.
Не забудьте прочитать текст из Combo перед преобразованием и установить его в TextBox.
Я знаю, что это не подходящее решение, но оно работает.
Я хочу знать, есть ли у кого-нибудь идея получше.
РЕДАКТИРОВАТЬ вопрошающего:
Вот код, который я в конечном итоге написал:
// Using CellClick and CellLeave in this way allows us
// to stick combo boxes in a particular row, even if the
// parent column type is different
private void dataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex >= FIRST_COL && e.ColumnIndex <= LAST_COL && e.RowIndex == ROW_OF_INTEREST)
{
object value = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
dataGrid.Columns[e.ColumnIndex].CellTemplate = new DataGridViewComboBoxCell();
var cell = new DataGridViewComboBoxCell {Value = value};
cell.Items.AddRange(_values);
dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex] = cell;
}
}
private void dataGrid_CellLeave(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex >= FIRST_COL && e.ColumnIndex <= LAST_COL && e.RowIndex == ROW_OF_INTEREST)
{
object value = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
dataGrid.Columns[e.ColumnIndex].CellTemplate = new DataGridViewTextBoxCell();
var cell = new DataGridViewTextBoxCell {Value = value};
dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex] = cell;
}
}
Кроме того, при создании столбца я должен был убедиться, что это общий столбец; то есть не DataGridViewTextBoxColumn:
var col = new DataGridViewColumn
{
CellTemplate = new DataGridViewTextBoxCell()
};
Таким образом, я мог бы изменить CellTemplate позже.