2

問題: 2 つのフォームを持つプログラムを作成しました。Form1 でボタンが押されると、プログラムは Form1 を「隠し」、Form2 を「表示」します。問題は、Form2 を閉じると、プログラムがバックグラウンドで実行され続けることです。これは、プログラムを終了するために Form1 を非表示にするのではなく、閉じる必要があるためだと思います。

私の質問は、Second Form をオーバーライドしてプログラムを閉じ、非表示にしないようにするにはどうすればよいですか?

    private void btnCreate_Click(object sender, EventArgs e)
    {
        Form2.Show(); 
        Form1.Hide();
    }

Form2 から Form1 を再度表示してから閉じることができることはわかっていますが、それは避けたいと思います。

4

3 に答える 3

7

アプリケーションの状態に応じて、それを行うためのオプションはほとんどありません。

最初の直感的な解決策は、 forClose()の代わりに呼び出すことです。これは、 がアプリケーションのメインフォームでない場合にのみ機能します (メイン メッセージ ループ内のフォームが で始まる場合)。Hide()Form1Form1Application.Run()

FormClosed2 番目の解決策は、イベントのイベント ハンドラーを追加し、Form22 番目のフォームが閉じられたときに最初のフォームを閉じることです。

private void btnCreate_Click(object sender, EventArgs e)
{
    Form2.Show();
    Form2.FormClosed += new FormClosedEventHandler(delegate { Close(); });
    Form1.Hide();
}

直接閉じるForm1か呼び出すことができますApplication.Exit()(複数のフォームを開いた場合は、まとめて閉じる必要があります)。

最後の解決策は、2 番目のフォームを最初のフォームの所有者にすることです。

private void btnCreate_Click(object sender, EventArgs e)
{
    Form2.Show();
    Form1.Owner = Form2;
    Form1.Hide();
}

これにより、所有者が閉じられると、所有されているフォームが自動的に閉じられます。これは私が好む解決策ですが、1 つのフォームに対してのみ機能します (所有者は 1 つのフォームしか所有できません)。

于 2013-10-22T11:12:28.600 に答える
3

イベントを使用できますFormClosed

    private void btnCreate_Click(object sender, EventArgs e)
    {
        Form2.Show();
        Form2.FormClosed += new FormClosedEventHandler(form2_FormClosed);
        Form1.Hide();
    }

    void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Form1.Close();
    }
于 2013-10-22T11:05:05.260 に答える
0

特にユーザーのための winforms のアプリケーション開発では、他のすべてのフォームが表示されるメイン フォームとなるメイン フォーム (mdiparent または単一の親) を常に用意します。

質問に答えることは、プログラミングの悪い習慣を助長することになります。

メインフォームを閉じると、アプリケーションが終了します。form1 を非表示にしても、アプリケーションは終了しません。

于 2013-10-22T11:21:18.217 に答える