C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■84134 / 5階層)  多階層のxmlのDataTableへの読み書きについて
□投稿者/ 魔界の仮面弁士 (1286回)-(2017/05/18(Thu) 23:54:03)
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;
}
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: 多階層のxmlのDataTableへの読み書きについて /なと →Re[6]: 多階層のxmlのDataTableへの読み書きについて /なと
 
上記関連ツリー

多階層のxmlのDataTableへの読み書きについて / なと (17/05/17(Wed) 18:28) #84124
Re[1]: 多階層のxmlのDataTableへの読み書きについて / WebSurfer (17/05/17(Wed) 18:54) #84125
Re[1]: 多階層のxmlのDataTableへの読み書きについて / 魔界の仮面弁士 (17/05/17(Wed) 19:47) #84126
  └ Re[2]: 多階層のxmlのDataTableへの読み書きについて / なと (17/05/17(Wed) 20:24) #84127
    └ Re[3]: 多階層のxmlのDataTableへの読み書きについて / 魔界の仮面弁士 (17/05/17(Wed) 20:46) #84128
      └ Re[4]: 多階層のxmlのDataTableへの読み書きについて / なと (17/05/18(Thu) 21:40) #84132
        └ 多階層のxmlのDataTableへの読み書きについて / 魔界の仮面弁士 (17/05/18(Thu) 23:54) #84134 ←Now
          └ Re[6]: 多階層のxmlのDataTableへの読み書きについて / なと (17/05/19(Fri) 09:44) #84135 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信