DOBON.NET DOBON.NETプログラミング掲示板過去ログ

他の画面のクロージングイベントでキャンセルされたらメイン画面を閉じないよ うにしたい。

環境/言語:[VB2008 win7 ]
分類:[.NET]

お世話になります。
メインメニューのような画面があり、そこから画面が呼び出されるというプログラムを作成しています。

メイン画面のクロージング時にApplication.Exitを呼び出しています。
その際にメインメニューから呼び出された画面のクロージングイベントが走り、各画面のクロージングイベント内の終了確認ダイアログが表示されます。

各画面の終了ダイアログで、終了をキャンセルしたときにメインメニューのクロージングをキャンセルしたいのですがどのようにすればよいのでしょうか?

Application.Exitは各画面のクロージング内でキャンセルされるとExitがキャンセルされるようなのですが、クロージングイベント自体はキャンセルされないためメイン画面が閉じてしまいます。
■No31686に返信(satoshiさんの記事)

こんにちは。

アプリケーション(自分自身)を終了させる
http://dobon.net/vb/dotnet/programing/applicationexit.html

にありますが、Application.Exitメソッドの引数にCancelEventArgsオブジェクトを渡すと、アプリケーションの終了がキャンセルされたかが分かります。これを使って、終了がキャンセルされた時にメインフォームを閉じないようにできないでしょうか?
■No31686に返信(satoshiさんの記事)

メインフォームがとじたらアプリが終了するなら
Application.Exitを使わなくてもプロジェクトの設定で
シャットダウンモードを『スタートアップフォームが閉じるとき』
にしておけば良いのでは?

メインフォームのFormClosingの例です。

        If Application.OpenForms.Count > 1 Then
            Dim OpenForms = Application.OpenForms.OfType(Of Form).ToList
            For Each frm As Form In OpenForms
                If frm IsNot Me Then
                    frm.Close()
                    If Not frm.IsDisposed Then
                        e.Cancel = True
                        Exit Sub
                    End If
                End If
            Next
        End If
お二人回答ありがとうございます。

実はメインメニューがスタートページではないんですよね。

結局、メインからの画面数が限られているので、一つ一つの画面のアクティブプロパティを確認して、開いていたらクローズメソッドを呼び、その後開いていた場合はメインのクローズをキャンセルするという方法を取ることにしました。

以下のような感じです。

メイン画面のクロージングメソッド内

If Gamen_AAA.Visible = true then
Gamen_AAA.close()
if Gamen_AAA.Visible = true Then
'閉じた後も開いていれば、Gamen_AAAのクロージングメソッド内でキャンセルされているということになる。
e.Cancel = True
Exit Sub
End If
End if


回答ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板