2011-10-03 40 views
4

在单个DataGridViewColumn中是否可以同时使用DataGridViewComboBoxCells和DataGridViewTextBoxCells?或者我绝对限制每列只有一种类型?在DataGridViewColumn中混合单元格类型

+0

对于我所知道的每栏都是一种类型。您可能必须从DataGridView继承以启用混合不同类型。 –

+0

有一些解决方法 - 看看http://www.sommergyll.com/datagridview-usercontrols/datagridview-with-combobox.htm –

回答

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。

+0

非常感谢 - 这很好地工作。在标记为接受之前,我有兴趣看看是否有任何“更清洁”的解决方案;但这是一个很大的帮助! – Smashery