2012-05-26 1 views
8

私のプロジェクトには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のがclosed.Soあるとき、私はForm2のの  form_FormClosingセクションに追加のソースに入れていた終了していないという欠点があります。

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

答えて

21

など)(MyContext.ShowForm1を呼び出します。それ以上のウィンドウがなくなると終了するように、それを調整する必要があります。このように:

[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; 
    } 
0

あなたがこの方法を取ることができます。

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

は、それは役に立ちました願っています。デフォルトでは

+0

em ..これは私の質問に書いたものと同じです。とにかく、 – jn4kim

+0

にお返事いただきありがとうございます。form1とform2を持っています。form1のボタンを押してform2を開くと、form1.Hide();それはform1を隠すでしょう、なぜあなたはform1を閉じたいのですか? – Shamal

2

、最初の形式は、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を作成したい場合は、Program.csの中に自動生成されたコードは、起動時のウィンドウを閉じたときにアプリケーションを終了するために書かれた

public class Program 
{ 
    public void Main() 
    { 
     Application.Run(new MyContext()); 
    } 
} 
0

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 
     } 
} 
関連する問題