/ / Mieszanie typów komórek w DataGridViewColumn - .net, winforms, datagridview, datagridviewcolumn

Mieszanie typów komórek w DataGridViewColumn - .net, winforms, datagridview, datagridviewcolumn

Czy możliwe jest posiadanie zarówno DataGridViewComboBoxCells, jak i DataGridViewTextBoxCells w jednym DataGridViewColumn? Czy też jestem absolutnie ograniczony do posiadania jednego typu na kolumnę?

Odpowiedzi:

6 dla odpowiedzi № 1

Jest na to dziwne rozwiązanie.
Domyślnie utwórz kolumnę jako TextBox.
Obsługuj kliknięcie komórki lub zdarzenie wprowadzania komórki.
W przypadku, gdy ColumnIndex pasuje, przekonwertuj typ kolumny na ComboBox i ustaw elementy.
Po uruchomieniu zdarzenia opuszczenia komórki z odpowiedniego indeksu kolumny przekonwertuj je z powrotem na pole tekstowe.
Nie zapomnij przeczytać tekstu z Combo przed konwersją i ustawić go na TextBox.

Wiem, że to nie jest trafne rozwiązanie, ale działa.
Chcę wiedzieć, czy ktoś ma lepszy pomysł.

EDYCJA pytającego:

Oto kod, który ostatecznie napisałem:

// 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;
}
}

Ponadto, tworząc kolumnę, musiałem upewnić się, że jest to kolumna ogólna; tzn. nie DataGridViewTextBoxColumn:

var col = new DataGridViewColumn
{
CellTemplate = new DataGridViewTextBoxCell()
};

W ten sposób mogłem zmienić CellTemplate później.