Смешивание типов ячеек в DataGridViewColumn - PullRequest
5 голосов
/ 03 октября 2011

Возможно ли иметь как DataGridViewComboBoxCells, так и DataGridViewTextBoxCells в одном DataGridViewColumn? Или я абсолютно ограничен одним типом на столбец?

1 Ответ

6 голосов
/ 03 октября 2011

Для этого есть странное решение.
По умолчанию создайте столбец как 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 позже.

...