5

두 개의 열이있는 DataGridView가 필요합니다. 첫 번째 열은 항상 DataGridViewComboBoxColumn 유형입니다. 해당 열의 선택에 따라 두 번째 열의 해당 셀을 DataGridViewComboBoxCell 또는 DataGridViewTextBoxCell로 변경할 수 있어야합니다.DataGridViewTextBoxCell과 DataGridViewComboBoxCell간에 전환하는 방법은 무엇입니까?

나는 DataGridViewColumn 유형의 두 번째 열을 만들 필요가 있다고 생각하지만, 즉시 셀 유형을 변경하는 방법을 이해하지는 못합니다. 나는 2005 년

감사합니다 사전에 비주얼 스튜디오에서 VB.NET 함께 일하고 있어요

!

업데이트 : 주위 한 가지 방법은, 내가 생각은 DataGridViewComboBoxColumn로 두 번째 열을 확인하고 드롭 다운 목록처럼 동작 하나 있도록 셀의 속성을 변경하거나 (편집으로하는 것입니다) 요소가없는 드롭 다운. 후자는 내가 살 수있는 텍스트 상자처럼 보이며 셀의 유형을 변경하지 않아도됩니다.

답변

3

VB.Net 버전이 없지만이 빠른 C# 코드 단편을 통해 올바른 방향으로 안내 할 수 있기를 바랍니다.

이 예제에서는 두 개의 열이있는 간단한 DataGridView를 설정합니다. 첫 번째로 DataGridViewComboBox는 "텍스트"또는 "콤보"의 두 가지 선택 항목으로 채워집니다.

두 번째 열은 처음에는 디자이너의 DataGridViewTextBoxColumn으로 설정됩니다.

DataGridView에서 CurrentCellDirtyStateChanged 이벤트를 처리합니다. 셀이 더럽고 첫 번째 열 (ComboBox) 만 확인합니다. CommitEdit을 호출하여 콤보에서 새 값을 가져와야합니다. 그렇지 않으면 이전 값을 볼 수 있습니다. 콤보 상자의 선택에 따라 필자는 두 번째 열의 셀을 해당 유형의 새 셀로 덮어 씁니다.

자신 만의 논리를 추가합니다 (드롭 다운을 채우고 값을 처리). 값을 저장 한 다음 셀에 다시 넣을 수도 있습니다. 여기에 빠른 VB 번역 나는 시험과 작품 있다는 것입니다

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(); 
      } 
     } 
    } 

: 여기

내가 사용에 신속하고 더러운 테스트를했던 코드입니다.

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 

최종 클래스

먼저 저장해야합니다, 그래서 당신은 그 칼럼에 저장된 값을 잃게됩니다.

+0

감사합니다. 도움이됩니다. 나는 VB 나 a가 아니다.NET 전문가 그래서 원칙적으로 무엇을하는지 보지만 VB에서 새로운 DataGridViewTextBoxCell 또는 새 DataGridViewComboBoxCell을 할당하는 방법은 아직 파악해야 할 사항입니다. 어쨌든 나는 당신이 당신의 대답에 넣었던 시간에 감사하고, 나는 오늘 오후에 그것을 시도 할 것입니다. – John

+0

잘 작동합니다. 고맙습니다! – John

2

사용자 정의 컨트롤을 호스팅하는 자체 셀 템플릿을 만들 수 있습니다. 사용자 정의 컨트롤에서 텍스트 상자와 콤보 박스를 추가하고 메서드/속성을 추가하여 다른 것을 숨길 수 있습니다.

This sample 라디오 버튼 셀을 만듭니다. 사용자 컨트롤을 호스팅하는 코드를 변경하기가 어렵지 않습니다.

0
dgvCell = new DataGridViewTextBoxCell();   // code to remove checkbox 
     dgvCell.Value = string.Empty; 
     dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell; 
관련 문제