WinFormで2つのテーブルをバインドする方法
WinForm で DataBinding を使用して、2 つのテーブルをバインドできます。以下は、その手順です。
- Visual StudioでWinFormアプリケーションを新規作成する
- デザインビューで、2つのDataGridViewコントロールをフォームにドラッグアンドドロップして、2つのテーブルをそれぞれ表現します。
- コードでは、2つのテーブルのデータを表す2つのDataTableオブジェクトを作成します。
DataTable table1 = new DataTable();
DataTable table2 = new DataTable();
- 主キーを持つ2つのテーブルがあるとすると、その主キーで結合できます。一方のテーブルに、もう一方のテーブルの主キー値を格納するために外部キーフィールドを追加します。
table1.Columns.Add("ID", typeof(int));
table1.Columns.Add("Name", typeof(string));
table1.Columns.Add("Table2ID", typeof(int));
table2.Columns.Add("ID", typeof(int));
table2.Columns.Add("Info", typeof(string));
- 表1の子テーブルとして表2を作成し、外部キーフィールドを使用して2つのテーブルを関連付けて、表1と表2にいくつかのデータを追加します。
table1.Rows.Add(1, "John", 1);
table1.Rows.Add(2, "Tom", 2);
table1.Rows.Add(3, "Lisa", 2);
table2.Rows.Add(1, "Info 1");
table2.Rows.Add(2, "Info 2");
- 2つの表をDataGridViewコントロールに個別にバインドします。
dataGridView1.DataSource = table1;
dataGridView2.DataSource = table2;
- DataBindイベントにイベントハンドラーを実装することで、DataGridViewコントロールのデータをネイティブにバインドします。
dataGridView1.DataBindingComplete += (sender, e) =>
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
int table2ID = Convert.ToInt32(row.Cells["Table2ID"].Value);
var info = table2.AsEnumerable().FirstOrDefault(r => r.Field<int>("ID") == table2ID);
row.Cells["Info"].Value = info?["Info"];
}
};
前述の手順により、2つのテーブルを2つのDataGridViewコントロールにバインドし、2つのテーブル間の関連表示を実現できます。