【WinForms入門】2つのフォームを連携させてみよう
~ボタンを押すと別のフォームのラベルが変わる~
目次
はじめに
WinFormsでアプリを作っていると、複数のフォーム(画面)を使いたくなることがあります。
例えば「メイン画面に情報を表示して、別の画面から操作したい」といったケースです。
今回は、Form2のボタンを押したら、Form1のラベルが変わるというシンプルな例を作ってみましょう。
完成イメージ
- アプリを起動すると、Form1(メイン画面)とForm2(操作画面)が同時に表示されます。
- 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(…) を呼び出している。
実行してみる
- アプリを起動すると、Form1とForm2が表示されます。
- 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(); にして「閉じる代わりに隠す」方式にすると安全です。
訪問数 23 回, 今日の訪問数 23回
ディスカッション
コメント一覧
まだ、コメントがありません