親ウィンドウから子ウィンドウを作成。データの受け渡し。

別ウィンドウを生成して、データを入力。その情報を親へ渡すサンプルです。

親と子が1対1

準備

親ウィンドウ(Form1)

  • Labelコンポーネント(label1)
  • Buttonコンポーネント(button1)

子ウィンドウ(Form2)

  • Buttonコンポーネント(button2)

コード

Form1クラス

using System;
using System.Windows.Forms;

namespace FormDataTrans
{
    public partial class Form1 : Form
    {
        public string Msg
        {
            get => label1.Text;
            set => label1.Text = value;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            new Form2(this).ShowDialog();
        }
    }
}

コード中のプロパティは省略形です。(インテリセンスで変換可能)

省略後

        public string Msg
        {
            get => label1.Text;
            set => label1.Text = value;
        }

省略前

        public string Msg
        {
            get
            {
                return label1.Text;
            }

            set
            {
                label1.Text = value;
            }
        }

Form2クラス

using System;
using System.Windows.Forms;

namespace FormDataTrans
{
    public partial class Form2 : Form
    {
        Form1 form1;

        public Form2(Form1 form1)
        {
            InitializeComponent();
            this.form1 = form1;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            form1.Msg = "ボタンを押された";
        }

        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            form1.Msg = "Form2が閉じられた";
        }
    }
}

実行結果

  • Form1のbutton1をクリックすると、Form2ウィンドウが作られる
  • Form2のbutton1をクリックすると、Form1のlabel1の表示が「ボタンを押された」に変わる
  • Form2を閉じるとForm1のlabel1の表示が「Form2が閉じられた」に変わる

親が複数、子が1

子から見て、自分を生成した親のデータを更新

準備

親1ウィンドウ(Form1)

  • Labelコンポーネント(label1)
  • Buttonコンポーネント(button1) Form2を生成します。
  • Buttonコンポーネント(button2) Form3を生成します。

親2ウィンドウ(Form3)

  • Labelコンポーネント(label1)
  • Buttonコンポーネント(button1) Form2を生成します。

子ウィンドウ(Form2)

生成元フォーム(親)のLabelを変更します。

  • Buttonコンポーネント(button2)

コード

インターフェース(IDummyData)

namespace FormDataTrans
{
    interface IDummyData
    { 
         string Msg { get; set; }
    }
}

Form1クラス

using System;
using System.Windows.Forms;

namespace FormDataTrans
{
    public partial class Form1 : Form, IDummyData
    {
        public string Msg
        {
            get => label1.Text;
            set => label1.Text = value;
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            new Form2().ShowDialog(this);
        }

        private void Button2_Click(object sender, EventArgs e)
        {
            new Form3().Show();
        }
    }
}

Form3クラス

using System;
using System.Windows.Forms;

namespace FormDataTrans
{
    public partial class Form3 : Form, IDummyData
    {
        public string Msg
        {
            get => label1.Text;
            set => label1.Text = value;
        }
        public Form3()
        {
            InitializeComponent();
        }
        private void Button1_Click(object sender, EventArgs e)
        {
            new Form2().ShowDialog(this);
        }
    }
}

Form2クラス

using System;
using System.Windows.Forms;

namespace FormDataTrans
{
    public partial class Form2 : Form
    {
        IDummyData parentForm;

        public Form2()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            parentForm.Msg = "ボタンを押された";
        }

        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            parentForm.Msg = "Form2を閉じられた";
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            parentForm = Owner as IDummyData;
        }
    }
}

実行結果

ポリモーフィズムを使って、Form2のコードを変更することなく、どのフォームからでも対応できるようにしています。

親1(Form1)の場合

  • Form1のbutton1をクリックすると、Form2ウィンドウが作られる
    Form2のbutton1をクリックすると、Form1のlabel1の表示が「ボタンを押された」に変わる
    Form2を閉じるとForm1のlabel1の表示が「Form2が閉じられた」に変わる

親2(Form3)の場合

  • Form1のbutton2をクリックすると、Form3ウィンドウが作られる
    Form2のbutton1をクリックすると、Form3のlabel1の表示が「ボタンを押された」に変わる
    Form2を閉じるとForm3のlabel1の表示が「Form2が閉じられた」に変わる