2011-07-16 8 views
1

저는 C#에서 조금 새로운 것이지만 Winforms를 사용하고 있으며 데이터 소스에 연결되어 있고 올바르게 채워지는 DataGridView가 있습니다.동적으로 추가 된 DataGridViewComboBoxColumn의 comboBox 셀 텍스트를 변경하는 방법은 무엇입니까?

또한 런타임에 ComboBoxColumn을 추가했습니다. 이 ComboBoxColumn이 데이터 소스에 연결되고 displaymember 및 valuemember가 설정되고 headertext가 설정된 다음 해당 열이 DataGrid에 추가됩니다. 연결이 제대로 작동하고 사용자가 comboBox를 클릭하면 예상대로 채워집니다.

사용자가 그리드에서 새 행을 완료하면 사용자가 comboBox에서 해당 항목을 분명히 선택하고 완료되면 전체 행이 내 데이터베이스로 업데이트됩니다.

제 질문은 :이 데이터 격자를 다시 열거 나 다시 그릴 때 데이터 소스 속성으로 인해 채워지지만 빈 상자 대신 원래 선택한 VALUE를 표시하도록 comboBox 셀을 얻는 방법은 무엇입니까? DB에서 값을 가져 와서 값을 넣는 코드를 알고 있습니다. 그 변수를 comboBox의 디스플레이에 넣을 수 있다면 이상적입니다. comboBox는 여전히 데이터 바운드이므로 사용자가 원하는 경우 값을 편집 할 수 있습니다.

정상적인 comboBox 컨트롤에서 .Text 속성을 설정해야한다는 것을 알고 있습니다. 그러나 DataGridViewComboBox에는 동일한 속성이 없습니다.

public void AddComboBoxColumn(DataGridView datagridName, DataTable table, string headerText, int columnIndex) 
    { 
     DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn(); 

     GetDisplayAndValueMembers(table, headerText); //Calls method that gets the datasource, displaymember, valuemember depending on column 

     column.DataSource = tableRef; //sets datasource to table referenced by column 
     column.DisplayMember = displayMember; //sets displaymember 
     column.ValueMember = valueMember; //sets valuemember 

     column.HeaderText = headerText; //changes headertext to displayed text 

     if (newColumnIndex == 0) 
      datagridName.Columns.Add(column); //added to end of datagrid 
     else 
     { 
      datagridName.Columns.RemoveAt(columnIndex); 
      datagridName.Columns.Insert(newColumnIndex, column); //added in specific index if needed 
     } 
    } 

이것은 단지 드롭 다운의 dataconnection을 나타낸다 : 여기

는 실제 데이터 접속을위한 코드 및 comboBoxColumn의 추가이다. 분명히 많은 양의 코드와 함께 사용되는 많은 메소드가 있습니다. 하지만 이것은 문제가되지 않습니다. 이전에 선택한 항목을 comboBox의 텍스트로 표시하는 문제에 대해 어떻게 해야할지 모르겠습니다.

+1

아마도 관련 코드를 표시하도록 질문을 향상 시키시겠습니까? –

답변

1

DataPropertyName 속성은 ComboBoxColumn입니다. 이 속성은 DataGridViewDataSourceComboBoxColumn의 선택된 값 사이의 바인딩을 만듭니다.

예를 들어, 콤보 상자에 표시된 제품 목록이 있다고 가정 해보십시오. 그런 다음 DataGridViewDataSource에 ProductId가 있습니다. 이런 식으로 뭔가 :

// There Orders is a data table coming from the db which includes the product id column 
dataGridView1.DataSource = Orders; 

// You set up your column just the same, with the DisplayMember and ValueMember 
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();   
GetDisplayAndValueMembers(table, headerText); 
column.DataSource = tableRef; //sets datasource to table referenced by column 
column.DisplayMember = displayMember; //sets displaymember 
column.ValueMember = valueMember; //sets valuemember  
column.HeaderText = headerText; //changes headertext to displayed text 

//Now you also set the DataPropertyName 
column.DataPropertyName = "ProductId"; // this is the name of a column or property from the grid datasource 

dataGridView1.Columns.Add(column); 

DataPropertyName 세트는 이제 ComboBoxColumnDataGridView 사이의 데이터 바인딩이있을 것이다.

데이터 원본이 절대적으로 콤보 상자 속성 값을 가질 수없는 경우 사용자 지정 코드 내에 ComboBoxColumn의 저장 및 값 설정을 모두 처리해야합니다.

DataGridViewComboBoxCell의 값을 설정하려면 셀을 선택한 다음 Value 속성을 설정해야합니다.

dataGridView1.Rows["rowname"].Cells["columnname"].Value = valueFromDb; 
+0

이것은 완벽하게 작동합니다! column.DataPropertyName은 정확하게 그것을 해결했습니다. dataGridView.Value 문을 추가 할 필요가 없었습니다. 다윗에게 정말 감사드립니다. –

관련 문제