【WinForms入門】2つのフォームを連携させてみよう

~ボタンを押すと別のフォームのラベルが変わる~

はじめに

WinFormsでアプリを作っていると、複数のフォーム(画面)を使いたくなることがあります。

例えば「メイン画面に情報を表示して、別の画面から操作したい」といったケースです。

今回は、Form2のボタンを押したら、Form1のラベルが変わるというシンプルな例を作ってみましょう。


完成イメージ

  1. アプリを起動すると、Form1(メイン画面)とForm2(操作画面)が同時に表示されます。
  2. Form2のボタンをクリックすると、Form1のラベルに「押しましたよ」と表示されます。

手順

1. フォームを用意する

  • Form1 … ラベル(label1)を配置する。
  • Form2 … ボタン(button1)を配置する。

Visual Studio のデザイナでドラッグ&ドロップすればOKです。


2. Form1のコード

Form1には ラベルの内容を変えるメソッド を作ります。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // Form2に自分自身(this)を渡す
        Form2 form2 = new Form2(this);
        form2.Show();
    }

    // 外から呼び出せるメソッド
    public void ShowLabel(string msg)
    {
        label1.Text = msg;
    }
}

ポイント:

  • new Form2(this) で Form1自身をForm2に渡している
  • ShowLabel は、文字列を受け取ってラベルに表示するだけのメソッド。

3. Form2のコード

Form2は、渡されたForm1を覚えておいて、ボタンクリック時に呼び出します。

public partial class Form2 : Form
{
    public Form2(Form1 form1)
    {
        Form1 = form1;
        InitializeComponent();
    }

    // Form1の参照を保持するプロパティ
    public Form1 Form1 { get; }

    private void button1_Click(object sender, EventArgs e)
    {
        // Form1のラベルを更新
        Form1.ShowLabel("押しましたよ");
    }
}

ポイント:

  • コンストラクタで受け取ったForm1をプロパティに保存している。
  • button1_Click で Form1.ShowLabel(…) を呼び出している。

実行してみる

  1. アプリを起動すると、Form1とForm2が表示されます。
  2. Form2のボタンをクリックすると、Form1のラベルが 「押しましたよ」 に変わります。

とてもシンプルですが、これで 「別フォームからメインフォームを操作する」 基本が体験できます。


まとめ

  • 複数フォームを使うときは、相手のフォームを参照として渡すのが基本。
  • Form1 → Form2 に this を渡すことで、Form2からForm1の公開メソッドを呼び出せました。
  • 難しい仕組みを使わなくても、これだけで 画面同士の連携 ができます。

参考

片方向(Form1 → Form2)だけの依存にして、Form1のボタンを押すとForm2のラベルが変わる最小構成を示します。デザイナーでは以下だけ置いてください。

  • Form1:Button(button1)
  • Form2:Label(label1)

コード一式(コピペ可)

Form1.cs(Form1 → Form2 に片方向参照)

using System;
using System.Windows.Forms;

namespace TwoFormsSample
{
    public partial class Form1 : Form
    {
        private Form2 _form2; // Form2 への参照(片方向)

        public Form1()
        {
            InitializeComponent();

            // 起動時に Form2 を生成・表示
            _form2 = new Form2();
            _form2.Show();

            // デザイナーで button1 を置いた前提。イベント未設定なら以下でハンドラを登録。
            this.button1.Click += button1_Click;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Form1 のボタン押下で Form2 のラベルを書き換える
            _form2?.SetLabelText("Form1から更新しました");
        }
    }
}

Form2.cs(公開メソッドでラベル更新)

using System.Windows.Forms;

namespace TwoFormsSample
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        // ラベルを書き換えるための公開メソッド(Form2はForm1を知らない=片方向)
        public void SetLabelText(string text)
        {
            label1.Text = text;
        }
    }
}

補足(初心者向けのポイント)

  • 依存関係は Form1 → Form2 のみ。Form2はForm1を全く参照しません(片方向矢印)。
  • Show() でモデルレス表示にしています(ShowDialog() にするとForm1が操作できなくなるため非推奨)。
  • デザイナーでイベントを結び忘れても、Form1 コンストラクタ内の button1.Click += … が保険になります。
  • ユーザーが Form2 を×で閉じると参照が無効になるので、必要に応じて Form2 側の FormClosing を e.Cancel = true; this.Hide(); にして「閉じる代わりに隠す」方式にすると安全です。
訪問数 21 回, 今日の訪問数 21回