C#でWindowsアプリケーションを開発する際、複数のフォーム(画面)を使い分けたい場面は多くあります。たとえば、「ログイン画面 → メイン画面」や「詳細設定画面 → 設定完了画面」など、機能や役割ごとにフォームを分けることで、見やすく使いやすいアプリケーションが実現できます。
この記事では、C#とWindows Forms(WinForms)を使って、複数のフォーム間でデータをやり取りしながら画面遷移するシンプルなアプリの作成方法を、実例を交えて詳しく解説します。初心者の方でも理解できるよう、ステップバイステップで進めていきます。
開発環境の準備
まずは開発環境の確認です。
- 開発ツール:Visual Studio 2022(無料のCommunity版でOK)
- .NETのバージョン:.NET Framework 4.7.2以上(または.NET 6以降)
Visual Studioを起動し、新しいプロジェクトを作成します。
- [新しいプロジェクトの作成] → [Windows フォーム アプリ(.NET Framework)]を選択
- プロジェクト名は
MultiFormApp
にします - 作成ボタンをクリック
これで、Form1が最初のフォームとして自動生成されます。
フォームの構成と役割
今回は2つのフォームを使います。
- Form1:最初に表示される「メインフォーム」
- Form2:別ウィンドウとして開く「サブフォーム」
ボタンを押すとサブフォームが開き、そこに入力した文字をメインフォームに戻す仕組みを作ります。
Form1の設計とコード
まずはForm1にボタンとラベルを配置します。
デザイン
- Label(名前:
labelMessage
) - Button(名前:
buttonOpenForm2
、テキスト:”サブフォームを開く”)
コード(Form1.cs)
using System;
using System.Windows.Forms;
namespace MultiFormApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonOpenForm2_Click(object sender, EventArgs e)
{
Form2 subForm = new Form2();
subForm.MessageSent += SubForm_MessageSent;
subForm.Show();
}
private void SubForm_MessageSent(string message)
{
labelMessage.Text = $"受け取ったメッセージ:{message}";
}
}
}
Form2の設計とコード
Form2にはテキストボックスとボタンを配置し、入力された文字列をForm1に送ります。
デザイン
- TextBox(名前:
textBoxInput
) - Button(名前:
buttonSend
、テキスト:”送信”)
コード(Form2.cs)
using System;
using System.Windows.Forms;
namespace MultiFormApp
{
public partial class Form2 : Form
{
public delegate void MessageHandler(string message);
public event MessageHandler MessageSent;
public Form2()
{
InitializeComponent();
}
private void buttonSend_Click(object sender, EventArgs e)
{
string input = textBoxInput.Text;
MessageSent?.Invoke(input);
this.Close();
}
}
}
イベントとデリゲートのポイント
ここで重要なのが「イベントとデリゲート」です。
Form2からForm1にメッセージを送るには、Form2にイベント(MessageSent
)を定義し、Form1がそのイベントを購読する形で通信します。
この方法は以下の利点があります。
- 疎結合で設計できる(互いに強く依存しない)
- 汎用性が高く、再利用可能
複数のフォームで共通データを扱うには?
アプリ全体で共通のデータを扱いたいときは、static
クラスを使って共有する方法もあります。以下は簡単な例です。
共通クラス(CommonData.cs)
public static class CommonData
{
public static string SharedMessage { get; set; }
}
これにより、どのフォームからでも CommonData.SharedMessage
にアクセスできます。
まとめ:複数フォームの活用はUI設計の第一歩
複数のフォームを使ったアプリケーションは、画面の役割を分けることでユーザビリティが向上します。
今回紹介したように、イベントとデリゲートを使ってフォーム間でデータをやりとりする方法を理解すれば、より柔軟なアプリケーションが作れるようになります。
今後は以下の応用にもチャレンジしてみてください。
- モーダルダイアログ(
ShowDialog()
)の利用 - 子フォームでのバリデーション処理
- タブページやMDI(複数文書インターフェイス)の活用
Visual Studioで気軽に試せるので、ぜひ手を動かして学んでみましょう!