2011-10-03 63 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