단일 DataGridViewColumn에 DataGridViewComboBoxCells 및 DataGridViewTextBoxCells를 모두 포함 할 수 있습니까? 아니면 열당 하나의 유형을 갖는 것에 절대적으로 제한되어 있습니까?DataGridViewColumn의 셀 유형 혼합
4
A
답변
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
내가 아는 모든 것에 대해 열당 하나의 유형입니다. 다른 유형의 믹싱을 가능하게하려면 DataGridView에서 상속 받아야 할 것입니다. –
몇 가지 해결 방법이 있습니다 - http://www.sommergyll.com/datagridview-usercontrols/datagridview-with-combobox.htm –