我完全迷失了一些本来应该很简单的东西 .
我有两个DataSet,都包含两个DataTable . 每个DataTable都是我从两个数据库的模式中读取的表名和列名的列表 .
我将表的列表DataTable绑定到DataGridView,列的列表将DataTable列入主 - 详细模式的第二个DataGridView . 对于第一个DataSet,一切正常 .
然后我将两个DataGridViewComboBoxColumn添加到每个DataGridView并将这些列的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);
}
}
}
1 回答
这个问题困扰了我好几天,当我终于问到这个问题时......我找到了答案 .
正如所料,答案很简单 . 我在这篇文章中找到了灵感How to: Ensure Multiple Controls Bound to the Same Data Source Remain Synchronized
我的解决方案是在bindingSourceTables1的CurrentChanged事件中添加此代码: