DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

モードレスウィンドウが閉じられた時に結果を取得する

モーダルダイアログとしてフォームを表示したとき(ShowDialogメソッドでフォームを表示したとき)は、DialogResultプロパティで結果を取得することができますが、モードレスで表示したとき(Showメソッドでフォームを表示したとき)はできません。モードレスウィンドウが閉じられた時に結果を取得するにはどのようにすればよいのでしょうか?

ここでは、Form1からForm2をモードレスで表示し、Form2が閉じた時にForm1で結果を取得する方法を考えます。

まず、Form1クラスにForm2のFormClosedイベントハンドラ(.NET Framework 1.1以前では、Closedイベントハンドラ)を作成して、Form2が閉じられた時に結果を取得するようにします。

以下の例では、Form1のButton1をクリックするとForm2を表示し、Form2が閉じた時にForm2のDialogResultプロパティを表示しています。このコードは、Form1クラス内に記述してください。

VB.NET
コードを隠すコードを選択
'Button1のClickイベントハンドラ
Private Sub Button1_Click(sender As Object, e As EventArgs) _
    Handles Button1.Click

    'Form2を作成する
    Dim f2 As New Form2()
    'FormClosedイベントハンドラを追加
    AddHandler f2.FormClosed, AddressOf Form2_FormClosed
    '.NET Framework 1.1以前では、Closedイベントを使う
    'AddHandler f2.Closed, AddressOf Form2_Closed
    '表示する
    f2.Show()
End Sub

'Form2が閉じた時
Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs)
    Dim f2 As Form2 = DirectCast(sender, Form2)
    '結果を表示する
    Console.WriteLine(f2.DialogResult)
End Sub
C#
コードを隠すコードを選択
//Button1のClickイベントハンドラ
private void Button1_Click(object sender, EventArgs e)
{
    //Form2を作成する
    Form2 f2 = new Form2();
    //FormClosedイベントハンドラを追加
    f2.FormClosed += new FormClosedEventHandler(Form2_FormClosed);
    //.NET Framework 1.1以前では、Closedイベントを使う
    //f2.Closed += new EventHandler(Form2_Closed);
    //表示する
    f2.Show();
}

//Form2が閉じた時
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    Form2 f2 = (Form2)sender;
    //結果を表示する
    Console.WriteLine(f2.DialogResult);
}

Form2クラスでは、DialogResultプロパティに結果を設定してからフォームを閉じるようにします。

以下の例では、Form2のButton1をクリックすると、DialogResultプロパティをDialogResult.OKとして閉じるようにしています。このコードは、Form2クラス内に記述してください。

VB.NET
コードを隠すコードを選択
'Button1のクリックイベントハンドラ
Private Sub Button1_Click(sender As Object, e As System.EventArgs) _
    Handles Button1.Click

    '結果を設定する
    Me.DialogResult = DialogResult.OK
    '閉じる
    Me.Close()
End Sub
C#
コードを隠すコードを選択
//Button1のクリックイベントハンドラ
private void Button1_Click(object sender, System.EventArgs e)
{
    //結果を設定する
    this.DialogResult = DialogResult.OK;
    //閉じる
    this.Close();
}

このような方法以外に、掲示板では、Codingslaveさんが、別のスレッドを作成してForm.ShowDialogメソッドを呼び出すことにより、モードレスウィンドウのようにする方法を提案されています。

  • 履歴:
  • 2015/6/15 VB.NETのコードで、「End Sub」が抜けていたのを修正など。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。