문제

두 개의 열이있는 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top