是否可以在单个DataGridViewColumn中同时包含DataGridViewComboBoxCells和DataGridViewTextBoxCells?或者我绝对限制每列有一种类型?
答案 0 :(得分:6)
这有一个奇怪的解决方案。
默认情况下,将列创建为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。