メインフォームからサブフォームを閉じる - C#

メインフォームからサブフォームを閉じるコードを紹介します。

概要

メインフォームからサブフォームを閉じるには、フォームのインスタンスオブジェクトを保持している場合には、Close() メソッドを呼び出すとフォームを閉じられます。

プログラム例

UI

下図のフォームを作成します。フォームにボタンを2つ配置します。メインフォームになります。


もう一つフォームを作成し、下図のフォームを作成します。サブフォームになります。

コード

以下のコードを記述します。メインフォームの2つのボタンのクリックイベントを実装します。
namespace MultiFormCloseFromMainForm
{
  public partial class FormMain : Form
  {
    private FormSub form;

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      form = new FormSub();
      form.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      form.Close();
    }
  }
}

解説

FormSub オブジェクトを保存する form 変数をクラスのメンバ変数として宣言し、メソッド終了後も値を保持する変数とします。
button1(Show SubForm ボタン)をクリックするとサブフォームを表示し、button2(Close SubForm ボタン)をクリックすると表示したサブフォームを閉じます。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Show SubForm]をクリックします。サブフォームが表示されます。


メインフォームの[Close SubForm]ボタンをクリックします。開いたサブフォームが閉じられます。


なお、複数回ボタンをクリックすると、複数フォームが表示されます。


この状態で、[Close SubForm]ボタンをクリックすると、最後に開いたフォームが閉じられます。 再度[Close SubForm]ボタンをクリックしてもフォームは閉じられません。

複数のフォームを閉じられるようにする

複数回ボタンがクリックされた場合にフォームを閉じられるようにする方法の一つとして、Stackを宣言して作成したそれぞれのフォームのインスタンスを保持する方法があります。

コード

以下のコードに変更します。
using System.Windows.Forms;

namespace MultiFormCloseFromMainForm
{
  public partial class FormMain : Form
  {
    Stack<FormSub> forms=new Stack<FormSub>();

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      FormSub fs = new FormSub();
      forms.Push(fs);
      fs.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      if (0 < forms.Count) {
        forms.Pop().Close();
      }
    }
  }
}

解説

FormSubのスタックを宣言し、オブジェクトを作成します。
  Stack<FormSub> forms=new Stack<FormSub>();

button1(Show SubForm ボタン)をクリックするとフォームオブジェクトを作成し、スタックにプッシュし、その後Showメソッドでサブフォームを表示します。
  private void button1_Click(object sender, EventArgs e)
  {
    FormSub fs = new FormSub();
    forms.Push(fs);
    fs.Show();
  }

button2(Close SubForm ボタン)をクリックするとスタックからポップして取得したFormSubオブジェクトのCloseメソッドを呼び出してサブフォームを閉じます。
  private void button2_Click(object sender, EventArgs e)
  {
    if (0 < forms.Count) {
      forms.Pop().Close();
    }
  }

実行結果

プロジェクトを実行し、[Show SubForm]ボタンを複数回クリックし、サブフォームを複数表示します。


[Close SubForm]ボタンをクリックします。最後に開いたフォームが閉じられます。


[Close SubForm]ボタンをクリックするごとにフォームが閉じられます。




複数のサブフォームを閉じる動作に対応できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-04-26
改訂日: 2024-09-20
iPentec all rights reserverd.