DataGridViewTextBoxCell과 DataGridViewComboBoxCell 사이를 전환하는 방법은 무엇입니까?
문제
두 개의 열이있는 DataGridView를 원합니다. 첫 번째 열은 항상 DataGridViewComboBoxColumn 유형입니다. 해당 열의 선택에 따라 두 번째 열의 해당 셀을 DataGridViewComboBoxCell 또는 DataGridViewTextBoxCell로 변경할 수 있습니다.
DataGridViewColumn 유형의 두 번째 열을 만들어야한다고 생각하지만 셀 유형을 즉시 변경하는 방법의 메커니즘을 이해하지 못합니다.
Visual Studio 2005에서 vb.net과 함께 일하고 있습니다.
미리 감사드립니다!
업데이트: 주변의 한 가지 방법은 두 번째 열을 DataGridViewComboBoxColumn으로 만들고 셀의 속성을 변경하여 드롭 다운 목록처럼 작동하거나 요소가없는 (편집 가능한) 드롭 다운으로 변경하는 것입니다. 후자는 내가 함께 살 수있는 텍스트 상자처럼 보이며 셀의 유형을 바꾸는 것은 포함되지 않습니다.
해결책
나는 vb.net 버전이 없지만,이 빠른 C# 스 니펫이 당신을 올바른 방향으로 향하거나 지적하는 데 도움이되기를 바랍니다.
이 예에서는 2 개의 열이있는 간단한 DataGridView를 설정했습니다. 첫 번째는 DataGridViewCombobox입니다. "Text"또는 "Combo"라는 두 가지 선택이 있습니다.
두 번째 열은 처음에 디자이너의 DataGridViewTextBoxColumn으로 설정됩니다.
DataGridView에서 CurrentCellDirtyStateChanged 이벤트를 처리합니다. 셀이 더러워 졌는지 확인하고 첫 번째 열 (Combobox) 만 확인합니다. 콤보에서 새로운 가치를 얻으려면 CommitedIT에 전화해야합니다. 그렇지 않으면 이전 가치를보고 있습니다. 콤보 박스의 선택에 기초하여 I은 해당 유형의 새로운 셀로 두 번째 열에서 셀을 덮어 씁니다.
자신의 논리를 추가합니다 (드롭 다운을 채우고 값을 처리). 값을 저장 한 다음 다시 셀이나 다른 것에 넣을 수 있습니다.
다음은 내가 사용하고 빠르고 더러운 테스트를 수행 한 코드입니다.
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty == false)
{
return;
}
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
if (((string)dataGridView1.CurrentCell.Value) == "Text")
{
dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell();
}
else if (((string)dataGridView1.CurrentCell.Value) == "Combo")
{
dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell();
}
}
}
다음은 테스트하고 작동하는 빠른 VB 번역입니다.
Public Class Form1
Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
If DataGridView1.IsCurrentCellDirty = False Then
Return
End If
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
If DataGridView1.CurrentCell.ColumnIndex = 0 Then
If CStr(DataGridView1.CurrentCell.Value) = "Text" Then
DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell
ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then
DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell
End If
End If
End Sub
수업 종료
해당 열에 저장된 값을 잃게되므로 먼저 저장해야합니다.
존
다른 팁
사용자 컨트롤을 호스팅하는 고유 한 셀 템플릿을 만들 수 있습니다. 사용자 컨트롤에서 텍스트 상자와 콤보 박스를 추가하고 메소드/속성을 추가하여 하나를 표시하고 다른 것을 숨 깁니다.
이 샘플 라디오 버튼 셀을 생성하고 사용자 컨트롤을 호스팅하기 위해 코드를 변경하는 것은 어렵지 않습니다.
dgvCell = new DataGridViewTextBoxCell(); // code to remove checkbox
dgvCell.Value = string.Empty;
dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;