[C#] フォーム間でデータや値をやり取りする

このページのタグ:[C#] [フォーム]
C#でフォーム間でデータをやり取りする方法を紹介します。

UI

以下のUIを作成します。

FormMain


FormSub


コード

FormMain.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MultiFormDataTransfer
{
  public partial class FormMain : Form
  {
    private string receiveData ="";
    FormSub fs;

    public FormMain()
    {
      InitializeComponent();
      fs = new FormSub();
      fs.formMain = this;
    }

    private void button1_Click(object sender, EventArgs e)
    {      
      fs.Show();
    }

    public string ReceiveData
    {
      set
      {
        receiveData = value;
        textBox1.Text = receiveData;
      }
      get
      {
        return receiveData;
      }
    }

    private void button2_Click(object sender, EventArgs e)
    {
      fs.SendData = "Penguin";
    }
  }
}

FormSub.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MultiFormDataTransfer
{
  public partial class FormSub : Form
  {
    private string sendData="";
    public FormMain formMain;

    public FormSub()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (formMain != null) {
        formMain.ReceiveData = "Duck";
      }
    }

    public string SendData
    {
      set
      {
        sendData = value;
        textBox1.Text = sendData;
      }
      get
      {
        return sendData;
      }
    }

    private void FormSub_Load(object sender, EventArgs e)
    {
    }
  }
}

解説

フォーム間で情報を交換する場合、メインフォームからサブフォームへの受け渡しの場合はメインフォームではサブフォームのインスタンス変数を保持しているため、サブフォームのpublicメンバ変数を用いたり、プロパティを用いて情報を交換できます。一方サブフォームからメインフォームへ情報を受け渡す場合、サブフォームはメインフォームのインスタンスを保持していないため、サブフォームの呼び出し時にメインフォームのインスタンスをサブフォームの変数に渡すか、もしくはOwnerプロパティを設定し、サブフォームにメインフォームのインスタンスを伝える必要があります。

実行結果

アプリケーションを実行します。下図のウィンドウが表示されます。


Button1をクリックするとサブフォームが表示されます。


メインフォームのButton2をクリックするとサブフォームのテキストボックスにメインフォームから渡した文字列が表示されます。


サブフォームのButton1をクリックするとサブフォームから渡した文字列がメインフォームのテキストボックスに表示されます。

Ownerプロパティを用いる例

Ownerプロパティを用いる場合の例です。

FormMain.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MultiFormDataTransfer
{
  public partial class FormMain : Form
  {
    private string receiveData ="";
    FormSub fs;

    public FormMain()
    {
      InitializeComponent();
      fs = new FormSub();
      fs.Owner = this;
    }

    private void button1_Click(object sender, EventArgs e)
    {      
      fs.Show();
    }

    public string ReceiveData
    {
      set
      {
        receiveData = value;
        textBox1.Text = receiveData;
      }
      get
      {
        return receiveData;
      }
    }

    private void button2_Click(object sender, EventArgs e)
    {
      fs.SendData = "Penguin";
    }
  }
}

FormSub.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MultiFormDataTransfer
{
  public partial class FormSub : Form
  {
    private string sendData="";
    public FormMain formMain;

    public FormSub()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      FormMain fm = (FormMain)this.Owner;
      if (fm != null) {
        fm.ReceiveData = "Duck";
      }
    }

    public string SendData
    {
      set
      {
        sendData = value;
        textBox1.Text = sendData;
      }
      get
      {
        return sendData;
      }
    }
  }
}

実行結果はOwnerプロパティを利用しない時と同じになります。
プライバシー    iPentecについて
iPentec all rights reserverd. (ISDC)