在DataGridViewColumn中混合单元格类型

时间:2011-10-03 06:17:31

标签: .net winforms datagridview datagridviewcolumn

是否可以在单个DataGridViewColumn中同时包含DataGridViewComboBoxCells和DataGridViewTextBoxCells?或者我绝对限制每列有一种类型?

1 个答案:

答案 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。