在第一個視窗中,名為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