WinForms フォーム間通信 チュートリアル(コンストラクタを活用)

2025年3月3日

目的

このチュートリアルでは、以下のことを学びます。

  • Visual Studio で新しい WinForms アプリケーションを作成する方法
  • 2 つのフォーム(Form1 と Form2)の作成とデザイン
  • Form2 のボタンをクリックして Form1 のラベルのテキストを更新する方法

必要なもの

  • Visual Studio(C# の WinForms アプリケーションが作れる環境)
  • 基本的な C# の知識(変数やメソッドの概念など)

ステップ 1: 新しいプロジェクトの作成

  1. Visual Studio を起動します。
  2. 「新しいプロジェクト」を選択し、「Windows Forms アプリケーション」 を選びます。
  3. プロジェクト名(例:WinFormsTutorial)を入力してプロジェクトを作成します。

ステップ 2: Form1 のデザイン

  1. Form1 のデザイナー画面で、以下のコントロールを追加します。
    • Label
      • 名前: label1
      • 表示テキストは初めは任意(例:「初期テキスト」)
    • Button
      • 名前: buttonOpenForm2
      • 表示テキスト: 「フォーム2を開く」
  2. Button をダブルクリックして、buttonOpenForm2_Click イベントハンドラを自動生成します。

ステップ 3: Form1 のコードを編集

Form1 のコードに、Form2 を呼び出すコードと、Form2 から呼び出される「ラベル更新用の公開メソッド」を追加します。

Form1.cs

using System;
using System.Windows.Forms;

namespace WinFormsTutorial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Form2 から呼び出される公開メソッド
        // label1 のテキストを更新します
        public void SetLabelText(string text)
        {
            label1.Text = text;
        }

        // 「フォーム2を開く」ボタンのクリックイベント
        private void buttonOpenForm2_Click(object sender, EventArgs e)
        {
            // 現在の Form1 を渡して Form2 を生成
            Form2 form2 = new Form2(this);
            form2.Show();
        }
    }
}

ポイント:

  • SetLabelText メソッドを公開(public)にすることで、Form2 からラベルのテキストを変更できるようにしています。

ステップ 4: Form2 の作成とデザイン

  1. ソリューションエクスプローラーでプロジェクトを右クリックし、「追加」→「Windowsフォーム」 を選択して、名前を Form2.cs とします。
  2. Form2 のデザイナー画面で、Button を追加します。
    • 名前: buttonUpdateLabel
    • 表示テキスト: 「ラベル更新」
  3. Button をダブルクリックして、buttonUpdateLabel_Click イベントハンドラを自動生成します。

ステップ 5: Form2 のコードを編集

Form2 は、Form1 のインスタンスをコンストラクタで受け取り、ボタンをクリックしたときに Form1 の SetLabelText メソッドを呼び出してラベルを更新します。

Form2.cs

using System;
using System.Windows.Forms;

namespace WinFormsTutorial
{
    public partial class Form2 : Form
    {
        // Form1 のインスタンスを受け取るフィールド
        private Form1 mainForm;

        // コンストラクタ:Form1 のインスタンスを受け取ります
        public Form2(Form1 form1)
        {
            InitializeComponent();
            mainForm = form1;
        }

        // 「ラベル更新」ボタンのクリックイベント
        private void buttonUpdateLabel_Click(object sender, EventArgs e)
        {
            if (mainForm != null)
            {
                // Form1 の SetLabelText メソッドを使ってラベルのテキストを変更
                mainForm.SetLabelText("更新されました!");
            }
        }
    }
}

ポイント:

  • Form2 のコンストラクタで受け取った Form1 のインスタンスを利用し、Form1 内の公開メソッド SetLabelText を呼び出しています。

ステップ 6: アプリケーションの動作確認

  1. プロジェクトを ビルド し、実行 します。
  2. 起動した Form1 が表示されます。
  3. 「フォーム2を開く」ボタンをクリックすると Form2 が表示されます。
  4. Form2 の「ラベル更新」ボタンをクリックすると、Form1 の label1 のテキストが 「更新されました!」 に変わることを確認してください。

まとめ

このチュートリアルでは、

  • Visual Studio でのプロジェクト作成
  • フォームにコントロールを配置する方法
  • フォーム間でデータ(ここではラベルのテキスト)を渡す基本的な方法
    を学びました。

最初は、Form1 に公開メソッドを用意して、Form2 からそのメソッドを呼び出す方法が最も分かりやすい実装です。
慣れてきたら、イベントやデータバインディングなど、より高度な方法にも挑戦してみてください。


この手順に沿って進めることで、WinForms のフォーム間通信の基礎が理解できるはずです。
まずはシンプルな実装から始め、徐々に他の手法も学んでいきましょう。