12

私のプログラムの自動生成されたコードが起動すると、

Application.Run(new Form1());

Form1を起動します。別のフォームに切り替えて、同時にForm1を閉じたいと思います。問題は、「Form.ShowDialog()」で他のフォームを呼び出す前にForm1で「this.Close()」を使用すると、プログラムが終了することです。ShowDialogの後に置くと、Form2を閉じるまでバックグラウンドで表示されたままになり、Form2を閉じるとプログラムが終了します。

現在開いているフレームを同時に閉じながら、Frame2のコピーを生成するにはどうすればよいですか?

編集:.Show()を使用してFrame2を呼び出そうとしましたが、新しいフレームはすぐに閉じます。

4

3 に答える 3

8

次の解決策は期待どおりに機能します。

このサンプルコードを試すには、Visual Studioで新しいWinFormsアプリケーションを作成し(つまり、[ファイル]-> [新しいプロジェクト]、[Visual C#]-> [Windows Classic Desktop]を選択し、テンプレート "Windows Forms App(.NET Framework)"を使用)、次のように追加します。 2番目のフォーム。

2つのフォームの名前がForm1Form2であることを確認してから、生成されたソリューションのコードを次のように変更します。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed += 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}

そして、これはアプリケーションのエントリポイントです。次のように変更します。

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}

秘訣は、アプリケーションを終了するポイントで、パラメーターなしでApplication.Run()を使用し、Application.Exit()を使用することです。

これで、アプリケーションを実行すると、Form1が開きます。X(右上隅)をクリックすると、Form1が閉じますが、Form2代わりに表示されます。もう一度クリックするXと、フォームが閉じます(そしてアプリケーションも終了します)。

の起動をFormClosedイベントに配置する代わりに、ジョブをForm2実行するボタンを作成することもできますが、その場合は、ボタンが属するフォームを明示的Button1に閉じることを忘れないでください。this.Close()

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }
于 2012-11-22T16:16:30.537 に答える
6

this.Hide()これを閉じるのではなく、非表示にするが開いているものを呼び出す必要がthis.Close()あります(アプリケーションのメインフォームであるため、アプリケーションも閉じます)。

于 2011-05-25T08:55:33.747 に答える
1

同じグーグルでこの質問とコードプロジェクトを見つけました

作成者は基本的に、表示したいフォーム間の切り替えを管理するトップレベルのフォームを作成します。

于 2014-03-19T02:56:25.523 に答える