16

私のプロジェクトには、Form1とForm2の2つのフォームがあります。Form1にはボタンがあります。私がやりたいのは、Form1を閉じて、そのボタンがクリックされたときにForm2を表示することです。

まず、やってみました

Form2 frm = new Form2();
frm.Show();
this.Close();

しかし、Form1が閉じられると、Form2も閉じられました。次に、やってみました

Form2 frm = new Form2();
frm.Show();
this.Hide();

ただし、Form2を閉じたときにアプリケーションが終了しないという欠点があるため、Form2のform_FormClosingセクションに追加のソースを追加する必要がありました。

うーん....これが正しい方法かどうか疑問に思います....では、この問題を処理する適切な方法は何ですか?

4

4 に答える 4

36

Program.csの自動生成されたコードは、起動ウィンドウが閉じられたときにアプリケーションを終了するように記述されています。ウィンドウが残っていないときにのみ終了するように微調整する必要があります。このような:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var main = new Form1();
        main.FormClosed += new FormClosedEventHandler(FormClosed);
        main.Show();
        Application.Run();
    }

    static void FormClosed(object sender, FormClosedEventArgs e) {
        ((Form)sender).FormClosed -= FormClosed;
        if (Application.OpenForms.Count == 0) Application.ExitThread();
        else Application.OpenForms[0].FormClosed += FormClosed;
    }
于 2012-05-26T20:02:41.640 に答える
4

デフォルトでは、最初のフォームはWindowsフォームアプリケーションの存続期間を制御します。複数の独立したウィンドウフォームが必要な場合は、アプリケーションコンテキストをフォームとは別のコンテキストにする必要があります。

public class MyContext : ApplicationContext
{
   private List<Form> forms;     

   private static MyContext context = new MyContext();

   private MyContext()
   {
      forms = new List<Form>();
      ShowForm1();
   }

   public static void ShowForm1()
   {
      Form form1 = new Form1();
      context.AddForm(form1);
      form1.Show();
   }

   private void AddForm(Form f)
   { 
      f.Closed += FormClosed;
      forms.Add(f);
   }

   private void FormClosed(object sender, EventArgs e)
   {
      Form f = sender as Form;
      if (form != null)
          forms.Remove(f);
      if (forms.Count == 0)
         Application.Exit();
   }          
}

コンテキストを使用するには、(フォームではなく)Application.Runにコンテキストを渡します。別のForm1を作成する場合は、MyContext.ShowForm1()などを呼び出します。

public class Program
{
   public void Main()
   {
      Application.Run(new MyContext());
   }
}
于 2012-05-26T19:57:17.133 に答える
-1

あなたはこのようにすることができます:

form2 f2=new form2()
this.Hide();
f2.Show();

お役に立てば幸いです。

于 2012-05-26T19:45:41.430 に答える
-1

FormClosingイベントが発生している間に実行されるメソッドにそれを書き込みます。

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
      // Display a MsgBox asking the user if he is sure to close
      if(MessageBox.Show("Are you sure you want to close?", "My Application", MessageBoxButtons.YesNo) 
         == DialogResult.Yes)
      {
         // Cancel the Closing event from closing the form.
         e.Cancel = false;
         // e.Cancel = true would close the window
      }
}
于 2014-06-13T07:25:55.260 に答える