0

その中にサブウィンドウを開くプログラムがあります(mdi.parent)。その下の1つのウィンドウにあるコンポーネントを作成しましたが、そのインスタンスを1つだけ保持したいので、そのウィンドウが作成された後に実際に破棄されないようにします。

これはコードで行うことができます:

    // This prevents this window disposing from window close button, we want always show one and only
    // one instance of this window.
    FormClosing += (o, e) =>
                            {
                                Hide();
                                e.Cancel = true;
                            };

ただし、この後問題が発生した場合、プログラムを閉じるには、閉じるボタンを2回押す必要があります。最初に押すとサブウィンドウが閉じ、2番目に押すとプログラムが終了します。これはどのように回避できますか?

私はWinformsを使用しています。

4

5 に答える 5

2

Habib が言ったように、 を呼び出すことができますがApplication.Exit

アプリケーションを終了するために Application.Exit メソッドが呼び出された場合、Form.Closed および Form.Closing イベントは発生しません。

これが重要な場合は、次のようにすることができます (MDI 親コード):

    private Boolean terminating;

    protected override void OnClosing(CancelEventArgs e)
    {
        if (!terminating)
        {
            terminating = true;
            Close();
        }

        base.OnClosing(e);
    }
于 2012-08-09T06:20:46.077 に答える
1

Application.Exit()フォームクローズイベントを呼び出します。

Application.Exit-MSDN

すべてのメッセージポンプに終了する必要があることを通知し、メッセージが処理された後、すべてのアプリケーションウィンドウを閉じます。

于 2012-08-09T05:51:18.277 に答える
0

イベント ハンドラ メソッド内のコードFormClosingは少し簡潔すぎます。ユーザーがフォームを閉じないようにする役割を果たしますが、お気づきのように、プログラムでフォームを閉じることもできなくなります。

これは、イベントが発生するたびに渡されるのCloseReasonプロパティの値をテストすることで簡単に解決できます。FormClosingEventArgs

これらは、フォームが閉じようとしている理由を教えてくれます。値が の場合、フォームCloseReason.UserClosingを に設定e.Canceltrueて非表示にします。値がそれ以外の場合は、フォームを引き続き閉じることができます。

// This prevents this window disposing when its close button is clicked by the
// user; we want always show one and only one instance of this window.
// But we still want to be able to close the form programmatically.
FormClosing += (o, e) =>
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            Hide();
            e.Cancel = true;
        }
    };
于 2012-08-09T07:09:50.133 に答える
0

これを使って

       Form[] ch = this.MdiChildren;
       foreach (Form chfrm in ch)
       chfrm.Close();
于 2014-10-11T11:43:12.797 に答える
-1

アプリケーションを閉じたときに処理が行われない場合は、Application.Exit を使用できます。それ以外の場合はApplication.OpenForms、MDI 親のクロージング イベントでコレクションを確認し、開いている他のすべてのフォームを閉じることができます。

于 2012-08-09T06:29:05.963 に答える