2011-10-03 5 views
4

단일 DataGridViewColumn에 DataGridViewComboBoxCells 및 DataGridViewTextBoxCells를 모두 포함 할 수 있습니까? 아니면 열당 하나의 유형을 갖는 것에 절대적으로 제한되어 있습니까?DataGridViewColumn의 셀 유형 혼합

+0

내가 아는 모든 것에 대해 열당 하나의 유형입니다. 다른 유형의 믹싱을 가능하게하려면 DataGridView에서 상속 받아야 할 것입니다. –

+0

몇 가지 해결 방법이 있습니다 - http://www.sommergyll.com/datagridview-usercontrols/datagridview-with-combobox.htm –

답변

6

이상한 해결책이 있습니다.
기본적으로 열을 TextBox로 만듭니다.
셀 클릭 또는 셀 입력 이벤트를 처리합니다.
ColumnIndex가 일치하는 경우 열 유형을 ComboBox로 변환하고 항목을 설정하십시오.
각 열 인덱스에서 셀 나가기 이벤트가 발생하면 다시 텍스트 상자로 변환하십시오.
변환하기 전에 콤보에서 텍스트를 읽고 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