私のプログラムの自動生成されたコードが起動すると、
Application.Run(new Form1());
form1を起動します。別のフォームに切り替えて、同時にForm1を閉じたいと思います。問題は、「Form.ShowDialog()」で他のフォームを呼び出す前にForm1で「this.Close()」を使用すると、プログラムが終了することです。 ShowDialogの後に置くと、Form2を閉じるまでバックグラウンドで表示されたままになり、Form2を閉じるとプログラムが終了します。
現在開いているフレームを同時に閉じながら、Frame2のコピーを生成するにはどうすればよいですか?
編集:.Show()を使用してFrame2を呼び出そうとしましたが、新しいフレームはすぐに閉じます。
次の解決策は期待どおりに機能します。
このサンプルコードを試すには、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();
}
this.Hide()
を呼び出す必要があります。これにより、this.Close()
が閉じられます(アプリケーションのメインフォームであるため、アプリケーションも閉じられます)。
この質問と codeproject を同じグーグルで見つけました。
作成者は基本的に、表示したいフォーム間の切り替えを管理するトップレベルのフォームを作成します。