モーダルダイアログとしてフォームを表示したとき(ShowDialogメソッドでフォームを表示したとき)は、DialogResultプロパティで結果を取得することができますが、モードレスで表示したとき(Showメソッドでフォームを表示したとき)はできません。モードレスウィンドウが閉じられた時に結果を取得するにはどのようにすればよいのでしょうか?
ここでは、Form1からForm2をモードレスで表示し、Form2が閉じた時にForm1で結果を取得する方法を考えます。
まず、Form1クラスにForm2のFormClosedイベントハンドラ(.NET Framework 1.1以前では、Closedイベントハンドラ)を作成して、Form2が閉じられた時に結果を取得するようにします。
以下の例では、Form1のButton1をクリックするとForm2を表示し、Form2が閉じた時にForm2のDialogResultプロパティを表示しています。このコードは、Form1クラス内に記述してください。
'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
//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クラス内に記述してください。
'Button1のクリックイベントハンドラ Private Sub Button1_Click(sender As Object, e As System.EventArgs) _ Handles Button1.Click '結果を設定する Me.DialogResult = DialogResult.OK '閉じる Me.Close() End Sub
//Button1のクリックイベントハンドラ private void Button1_Click(object sender, System.EventArgs e) { //結果を設定する this.DialogResult = DialogResult.OK; //閉じる this.Close(); }
このような方法以外に、掲示板では、Codingslaveさんが、別のスレッドを作成してForm.ShowDialogメソッドを呼び出すことにより、モードレスウィンドウのようにする方法を提案されています。
(この記事は、「.NETプログラミング研究 第50号」で紹介したものを基にしています。)