0

나는 단순한 것으로 생각되는 뭔가를 잃어 버렸습니다.DataGridViewComboBoxColumn을 사용하는 DataGridView 마스터 세부

둘 다 두 개의 DataSet을 포함하는 두 개의 DataSet이 있습니다. 각 DataTable은 두 데이터베이스의 스키마에서 읽는 테이블의 이름 및 열 이름 목록입니다.

테이블의 목록 DataTable을 DataGridView에 바인딩하고 열의 목록 DataTable을 마스터 세부 모드의 두 번째 DataGridView에 바인딩합니다. 이 첫 번째 DataSet에는 모든 것이 잘 작동합니다.

그러면 DataGridView에 두 개의 DataGridViewComboBoxColumn을 추가하고 해당 열의 ComboBox를 두 번째 DataSet에 바인딩합니다.

마스터 DataGridView에서 행을 선택하면 세부 DataGridView에 선택한 행과 관련된 열이 채워집니다. 그러나 마스터 DataGridView의 DataGridViewComboBoxColumn을 선택하면 세부 DataGridView의 DataGridViewComboBoxColumn 만 업데이트됩니다.

어떻게하면 마스터 그리드의 행 선택을 ComboBox에 연결할 수 있습니까?

질문을 충분히 명확히하기를 바랍니다. 도움을 주셔서 감사합니다!

using System; 
using System.Data; 
using System.Windows.Forms; 

namespace MasterDetailTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private DataGridView dataGridView1 = new DataGridView(); 
     private DataSet dataSet1 = new DataSet(); 
     private BindingSource bindingSourceTables1 = new BindingSource(); 
     private BindingSource bindingSourceColumns1 = new BindingSource(); 

     private DataGridView dataGridView2 = new DataGridView(); 
     private DataSet dataSet2 = new DataSet(); 
     private BindingSource bindingSourceTables2 = new BindingSource(); 
     private BindingSource bindingSourceColumns2 = new BindingSource(); 


     private void Form1_Load(object sender, EventArgs e) 
     { 
      SetGrids(dataGridView1, dataGridView2); 

      dataGridView1.DataSource = bindingSourceTables1; 
      dataGridView2.DataSource = bindingSourceColumns1; 

      // DataSet1 
      DataTable tables1 = new DataTable("tables1"); 
      tables1.Columns.Add(new DataColumn("TABLE_NAME", typeof(string))); 
      tables1.Columns.Add(new DataColumn("TABLE_NAME2", typeof(string))); //Map DataSet2's table name to DataSet1's table name 

      DataTable columns1 = new DataTable("columns1"); 
      columns1.Columns.Add(new DataColumn("TABLE_NAME", typeof(string))); 
      columns1.Columns.Add(new DataColumn("COLUMN_NAME", typeof(string))); 
      columns1.Columns.Add(new DataColumn("COLUMN_NAME2", typeof(string))); //Map DataSet2's column name to DataSet1's column name 

      dataSet1.Tables.Add(tables1); 
      dataSet1.Tables.Add(columns1); 

      tables1.PrimaryKey = new DataColumn[] { tables1.Columns["TABLE_NAME"] }; 
      columns1.PrimaryKey = new DataColumn[] { columns1.Columns["TABLE_NAME"], columns1.Columns["COLUMN_NAME"] }; 

      dataSet1.Relations.Add(new DataRelation("TablesColumns", dataSet1.Tables["tables1"].Columns["TABLE_NAME"], dataSet1.Tables["columns1"].Columns["TABLE_NAME"])); 

      bindingSourceTables1.DataSource = dataSet1; 
      bindingSourceTables1.DataMember = "tables1"; 

      bindingSourceColumns1.DataSource = bindingSourceTables1; 
      bindingSourceColumns1.DataMember = "TablesColumns"; 

      // DataSet2 
      DataTable tables2 = new DataTable("tables2"); 
      tables2.Columns.Add(new DataColumn("TABLE_NAME2", typeof(string))); 

      DataTable columns2 = new DataTable("columns2"); 
      columns2.Columns.Add(new DataColumn("TABLE_NAME", typeof(string))); 
      columns2.Columns.Add(new DataColumn("COLUMN_NAME2", typeof(string))); 

      dataSet2.Tables.Add(tables2); 
      dataSet2.Tables.Add(columns2); 

      tables2.PrimaryKey = new DataColumn[] { tables2.Columns["TABLE_NAME2"] }; 
      columns2.PrimaryKey = new DataColumn[] { columns2.Columns["TABLE_NAME"], columns2.Columns["COLUMN_NAME2"] }; 

      dataSet2.Relations.Add(new DataRelation("TablesColumns", dataSet2.Tables["tables2"].Columns["TABLE_NAME2"], dataSet2.Tables["columns2"].Columns["TABLE_NAME"])); 

      bindingSourceTables2.DataSource = dataSet2; 
      bindingSourceTables2.DataMember = "tables2"; 

      bindingSourceColumns2.DataSource = bindingSourceTables2; 
      bindingSourceColumns2.DataMember = "TablesColumns"; 

      DataGridViewComboBoxColumn dccTables = new DataGridViewComboBoxColumn() 
      { 
       DataSource = bindingSourceTables2, 
       DataPropertyName = "TABLE_NAME2", 
       DisplayMember = "TABLE_NAME2", 
       ValueMember = "TABLE_NAME2", 
       HeaderText = "TABLE_NAME2", 
       Name = "TABLE_NAME2" 
      }; 

      dataGridView1.Columns.Remove("TABLE_NAME2"); 
      dataGridView1.Columns.Add(dccTables); 

      DataGridViewComboBoxColumn dccColumns = new DataGridViewComboBoxColumn() 
      { 
       DataSource = bindingSourceColumns2, 
       DataPropertyName = "COLUMN_NAME2", 
       DisplayMember = "COLUMN_NAME2", 
       ValueMember = "COLUMN_NAME2", 
       HeaderText = "COLUMN_NAME2", 
       Name = "COLUMN_NAME2" 
      }; 

      dataGridView2.Columns.Remove("COLUMN_NAME2"); 
      dataGridView2.Columns.Add(dccColumns); 

      //Data 
      CreateData(); 

     } 

     private void CreateData() 
     { 
      for (int i = 0; i < 3; i++) 
      { 
       DataRow dt = dataSet1.Tables["tables1"].NewRow(); 
       dt["TABLE_NAME"] = "TableName" + i; 
       dataSet1.Tables["tables1"].Rows.Add(dt); 

       for (int j = 0; j < 5; j++) 
       { 
        DataRow dc = dataSet1.Tables["columns1"].NewRow(); 
        dc["TABLE_NAME"] = "TableName" + i; 
        dc["COLUMN_NAME"] = "ColumnName" + i + j; 
        dataSet1.Tables["columns1"].Rows.Add(dc); 
       } 
      } 
      for (int i = 0; i < 3; i++) 
      { 
       DataRow dt = dataSet2.Tables["tables2"].NewRow(); 
       dt["TABLE_NAME2"] = "TableName" + i; 
       dataSet2.Tables["tables2"].Rows.Add(dt); 

       for (int j = 0; j < 5; j++) 
       { 
        DataRow dc = dataSet2.Tables["columns2"].NewRow(); 
        dc["TABLE_NAME"] = "TableName" + i; 
        dc["COLUMN_NAME2"] = "ColumnName" + i + j; 
        dataSet2.Tables["columns2"].Rows.Add(dc); 
       } 
      } 
     } 

     private void SetGrids(DataGridView dgv1, DataGridView dgv2) 
     { 
      dgv1.Width = 400; 
      dgv2.Width = 400; 
      dgv2.Top = dgv1.Height; 

      this.Controls.Add(dataGridView1); 
      this.Controls.Add(dataGridView2); 
     } 

    } 
} 

답변

0

이 문제는 며칠 동안 나에게 마침내 질문을 던졌고 그 대답을 찾았습니다.

예상대로 대답은 쉽습니다. 나는 내 솔루션은 bindingSourceTables1의 CurrentChanged 이벤트에 코드를 추가하는 것이 었습니다 How to: Ensure Multiple Controls Bound to the Same Data Source Remain Synchronized

이 문서에서 영감을 발견했습니다

private void bindingSourceTables1_CurrentChanged(object sender, EventArgs e) 
    { 
     bindingSourceTables2.Position = bindingSourceTables2.Find("TABLE_NAME2", ((DataRowView)((BindingSource)sender).Current).Row["TABLE_NAME2"]); 
    }