次の解決策は期待どおりに機能します。
このサンプルコードを試すには、Visual Studioで新しいWinFormsアプリケーションを作成し(つまり、[ファイル]-> [新しいプロジェクト]、[Visual C#]-> [Windows Classic Desktop]を選択し、テンプレート "Windows Forms App(.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と、フォームが閉じます(そしてアプリケーションも終了します)。
の起動をFormClosedイベントに配置する代わりに、ジョブをForm2
実行するボタンを作成することもできますが、その場合は、ボタンが属するフォームを明示的Button1に閉じることを忘れないでください。this.Close()
private void button1_Click(object sender, EventArgs e)
{
(new Form2()).Show(); this.Close();
}