0

Windows フォームに関する質問があります。

Program.cs:

Application.Run(new frmStart());

frmStart: オンbtnLoad_Click,

frmLoad formLoad = new frmLoad();
formLoad.Show();
this.Hide();   // if I do a this.Close();  after it shuts down and doesn't get to show the form

frmLoad: オンbtnCancel_Click:

Application.Exit();   
// or this.Close(); 
// or even: base.Close();

フォームは消えますが、プログラムは終了しません。停止するには、青い「デバッグの停止」を押す必要があります。

私は探していました...最初のフォームを画面に表示したままにしなくても、2番目のフォームを閉じたときにフリーズするだけでなく、プログラムを実際に停止させることができることを知っていますが、覚えていない方法がわかりません。

4

5 に答える 5

1

frmStartに次を追加します。

public static frmStart Current;

次に、コンストラクターで次を追加します。

Current = this;

次に frmLoad: on btnCancel_Click :

frmStart.Current.Close();
于 2012-07-16T23:17:28.917 に答える
1

両方で Close() を呼び出す必要があります。それ以外の場合、最初のフォームは閉じるように指示されず、クリーンアップされないため、これが唯一のクリーンな方法です。

これを行うのが安全であることはわかっているかもしれませんが、後でコードに取り組んでいる他の誰かが、呼び出す必要のある最初のフォームの OnClose にコードを追加する可能性があります。コードが呼び出されない理由を最終的に突き止めたとき、彼らはあなたについて良くないことを言うでしょう。

両方を閉じると、アプリは終了します。

于 2012-07-16T23:18:46.110 に答える
1

Application.ExitThread() メソッドを使用してください。このメソッドは、現在のスレッドのメッセージ ループを終了し、スレッドのすべてのウィンドウを閉じます。

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.exitthread

于 2012-07-16T23:18:58.357 に答える
1

Ack、Application.ExitThread で -1!

問題は、メイン フォームを閉じていないことです。最も簡単な方法は、2 番目のフォームの Closed イベントにフックして、メイン フォームを閉じることです。たとえば、2 番目のフォームを開くコードは次のように変更されます。

        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) => Close();
        newForm.Show();
        Hide();

これは基本的に、frmLoad フォームが閉じるときにメイン フォームがその Close() メソッドを呼び出すように設定します。イベント ハンドラーに Lambda 式を使用しましたが、(オブジェクト送信者、EventArgs e) を受け入れるプライベート メソッドを簡単に作成し、.FormClosed をポイントすることもできます。

*編集: 申し訳ありませんが、特定の状態でのみ閉じたいことを見逃していました。その場合、frmLoad で、次のようなパブリック プロパティを作成します。

public bool UserCancelled { get; プライベートセット; }

Cancel ボタンは、フォームを閉じる前にこれを True に設定します。メイン フォームのイベント ハンドラーは次のように変わります。

        var newForm = new frmLoad();
        newForm.FormClosed += (closedSender, closedE) =>
                                {
                                    if (newForm.UserCancelled)
                                        Close();
                                };
        newForm.Show();
        Hide();
于 2012-07-16T23:23:45.350 に答える
1

私はすべての答えに賛成票を投じます。プライマリ フォームで Form Closing をオーバーライドし、セカンダリ フォームを最初に閉じます。

于 2012-07-16T23:23:54.803 に答える