web-dev-qa-db-ja.com

C#でフォームを切り替える

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

Application.Run(new Form1());

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

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

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

10
rumsey

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

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

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

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再び、フォームが閉じます。

Form2の起動をFormClosedイベントに配置する代わりに、ジョブを実行するボタンを作成することもできますが、その場合は、this.Close()明示的に:

    private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }
7
Matt

this.Hide()を呼び出す必要があります。これにより、this.Close()が閉じられます(アプリケーションのメインフォームであるため、アプリケーションも閉じられます)。

5
Jackson Pope

この質問と codeproject を同じグーグルで見つけました。

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

1
Nathan Goings