|
■No84132 (なと さん) に返信 > Parentはそのまま > bsp = ds.Tables[tableName]; > dgvp.DataSurce = bsp; > dgvp.DataMember = "Parent"; > ですよね。
違います。 それだと『フィールド Parent の子リストを作成できません。』などのエラーとなる可能性があります。
上記の dgvp というのは、Parent 用の DataGridView を 指しているのだと思いますが(DataSurce → DataSource というのはさておき)、 Parent 行を DataGridView に表示するだけなら、 // DataMember は空のまま dataGridView1.DataSource = ds.Tables["Parent"]; もしくは dataGridView1.DataSource = ds; dataGridView1.DataMember = "Parent" ; です。
> XMLから読んだDataSetをBindingSourceとDataMemberに割り当てるときのプロパティがよく分からず、
とりあえずこんな感じ。空のフォームに貼って試してみてください。 ここでは説明のため、コントロールの配置やイベントの割り当ても、サンプルコード中で行っています。 (実際の開発には、コントロール等をデザイン時に配置しておくことができます)
親・子・孫という 3 つの DataGridView を並べてありますが、それぞれは BindingSource を通じてリレーションが貼られているため、 「子1」を選択すれば、長男の子供達(10歳と8歳)が自動的に表示され、 「子2」を選択すれば、次男の子供達(5歳と4歳)が自動的に表示されます。
public partial class Form1 : Form { private DataSet ds = new DataSet("Sample"); private DataGridView dgvParent, dgvChild, dgvGrandson;
private void Form1_Load(object sender, EventArgs e) { Sample(); }
private void Sample() { ds.Clear(); ds.ReadXml(@"C:\temp\test.xml");
// 各 DataGridView とのバインドはデザイン時に終わらせてあるので、 // ReadXml した後で、DataSource を再割り当てする必要はありません。 // // しかしながら、型指定のない「素の DataSet」の場合には、 // テーブル情報やリレーション情報が無いため、 // DataMember の割り当ては、ReadXml 後に行う必要があります。 // (事前に割り当ててしまうと、メンバー名が見つからずエラーになります) // bndParent.DataMember = "Parent"; bndChildren.DataMember = "Parent_Childs"; bndChild.DataMember = "Childs_Child"; bndGrandsons.DataMember = "Child_Grandsons"; bndGrandson.DataMember = "Grandsons_Grandson"; // // ただし、DataSet デザイナを用いて「型指定された DataSet」をあらかじめ用意しておき、 // それをデザイン時に bndParent.DataSource に割り当てていた場合には、 // 各種 DataMember の割り当てさえもデザイン時に済ませておくことができます。 // }
public Form1() { InitializeComponent();
#region コントロールの配置(実際はフォームデザイナで配置) // Load イベントの割り当てです。 this.Load += Form1_Load;
// フォームに BindingSource を貼ると、自動的に components がセットされるのですが // 今回はデザイン時処理もコードで書いていますので、下記では手動でセットしています。 if(components == null) { components = new System.ComponentModel.Container(); }
// リレーションごとに BindingSource を用意しておきます。 bndParent = new BindingSource(components); bndChildren = new BindingSource(components); bndChild = new BindingSource(components); bndGrandsons = new BindingSource(components); bndGrandson = new BindingSource(components);
bndParent.DataSource = ds; bndChildren.DataSource = bndParent; bndChild.DataSource = bndChildren; bndGrandsons.DataSource = bndChild; bndGrandson.DataSource = bndGrandsons;
// 下記では、親・子・孫の DataGridView を縦に3つ並べて配置しています。 // また、フォームのリサイズに合わせて大きさが変わるよう、 // それらを TableLayoutPanel の上に配置させています。 // var panel = new TableLayoutPanel() { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3 }; dgvParent = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false }; dgvChild = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false }; dgvGrandson = new DataGridView() { Dock = DockStyle.Fill, AllowUserToAddRows = false }; panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F)); panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F)); panel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / 3F)); panel.Controls.Add(dgvParent); panel.Controls.Add(dgvChild); panel.Controls.Add(dgvGrandson); Controls.Add(panel);
// データバインドの設定を行います。 // ここでは DataSource のみを設定していますが、元データに型付き DataSet を指定してある場合は、 // DataMember プロパティも事前に指定しておくことができます。 // dgvParent.DataSource = bndParent; dgvChild.DataSource = bndChild; dgvGrandson.DataSource = bndGrandson;
StartPosition = FormStartPosition.WindowsDefaultBounds; #endregion } private BindingSource bndParent; private BindingSource bndChildren, bndGrandsons; private BindingSource bndChild, bndGrandson; }
|