天天看點

C#Form打開一個新視窗的同時關閉這個窗體

在第一個視窗中,名為fristForm,這個視窗有一個按鈕,button1.第二個視窗為secondForm.

       button1對應的代碼為:

     Private void button1_Click(object sender,System.EventArgs e)

      {

               Form frm=new secondForm();

               frm.Show();

      }

請問要怎麼樣加代碼,當我點選button1的時候,第一個視窗關閉的同時第二個視窗打開。

我這樣寫

  Form frm=new secondForm();

      frm.Show();

      this.Close();

是錯的,因為在打開第二個視窗的同時兩個視窗又自動的關閉了。

還請問frm.Show();和frm.ShowDialog();有什麼差別?好像執行的效果都一樣的。

出現上述情況的原因是因為FirstForm是應用程式的消息循環主視窗,this.Close方法會關閉這個主視窗,進而關閉整個消息循環。因為SecondForm跟FirstForm使用同一個消息循環,是以消息循環的結束也就将SecondForm給關閉掉了。

       Jeffrey Tan(這家夥是微軟的)提出了一個解決方法:

對于這個問題,通常的解決方法是隐藏掉FirstForm,而不是關閉它。如果您一定希望關閉FirstForm,您需要建立另外一個線程,然後使用Application.Run來在這個新線程裡面開啟SecondForm的消息循環。

您可以使用FirstForm.Hide()方法來實作将FirstForm隐藏掉。這樣就不會關閉掉主視窗和消息循環了。您現在再FirstForm類裡面,您可以使用this.Hide()來調用。不過,您最好在被打開的Form2中通過構造函數傳入FirstForm的reference,這樣,Form2可以獲得FirstForm的引用,進而最後可以在需要的時候調用Close()方法關閉它,示例代碼如下:

private void button1_Click(object sender, EventArgs e)

{

    Form2 f = new Form2(this);

    f.Show();

    this.Hide();

}

您可以現在VS中添加一個Form2,然後添加一個帶參數的構造函數,如下:

public class Form2 : System.Windows.Forms.Form

{

private System.ComponentModel.Container components = null;

public Form2()

{

InitializeComponent();

}

Form1 m_form1=null;

public Form2(Form1 form1)

{

                                this.m_form1=form1;

InitializeComponent();

}

                ......

}

注意,在這段代碼裡面,我先在Form2類中定義了一個字段"m_form1"。然後,在構造函數裡面,我們可以将傳進來的form1指派給m_form1,這樣我們就可以在Form2中任意時候引用這個Form1進行使用了。

另外一種方法的示例代碼如下:

public void NewMessageLook()

{

Form f=new Form();

Application.Run(f);

}

private void button1_Click(object sender, System.EventArgs e)

{

System.Threading.Thread t=new

System.Threading.Thread( new System.Threading.ThreadStart(NewMessageLook));

t.Start();

this.Close();

}

本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/sum_binary/archive/2009/09/08/4530909.aspx