나는 단순한 것으로 생각되는 뭔가를 잃어 버렸습니다.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);
}
}
}