2011-07-26 32 views
2

我目前面臨的這種情況下,我需要你的幫助:一種阻塞/解鎖的WinForms調用

有兩個的WinForms Form 1和Form,點擊按鈕的Form1上的事件將啓動窗口2。 我想啓動form2並關閉(配置)form1。

我有兩種方法來調用窗口2:

1)使用與ShowDialog的()阻塞調用;

namespace programm 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
     { 
     InitializeComponent(); 
     } 

    private void callForm2bt_Click(object sender, EventArgs e) 
    { 
     Form2 form2 = new Form2(); 
     form2.ShowDialog(); 
     this.Close(); 
    } 
    } 
} 

在這種情況下,一旦調用了form2,我就無法關閉(配置)form1。

2)使用Show()的解除阻止調用;

namespace programm 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void callForm2bt_Click(object sender, EventArgs e) 
    { 
     Form2 form2 = new Form2(); 
     form2.Show(); 
     this.Close(); 

    } 
    } 
} 

在這種情況下,一旦form1關閉(配置)它就會自動配置form2。

任何想法如何處置form1和保持form2的功能?

感謝

+0

我真的不明白你想在這裏完成什麼。 –

回答

-1

考慮通過Form1構造Form2實例的注入,它減少了一類耦合,增加了靈活性,這樣就可以安全地處理form1並保持form2現場

+2

沒有@ @ downvoter。而「heyyyy」並不意味着什麼。 –

+0

由此我請求downvote的任何詳細說明。無論如何都同意「heyyy」,我會盡快修改它,只要編輯這個特別的評論 – sll

+0

原始答案沒有工作。我嘗試過這個。 –

1

要麼做反過來:運行Form2作爲主窗體,並將其可見性設置爲false,並從其開始Form1,當從Form1完成時關閉它並將Form2可見性設置爲true。所以:

static void Main() 
{ 
    ... 
    Application.Run(new Form2());//instead of Form1 
} 

public class Form2 ... 
{ 
    //At From2.Load: 
    private void Form2_Load(object sender, EventArgs e) 
    { 
     this.Hide();//the form2 will hide and show the form 1. 
     Form1 form1 = new Form1(this); 
     form1.Show(); 
    } 
} 

public class Form1... 
{ 

    private Form2 _form2 = null; 

    public Form1() 
    { InitializeComponents();} 

    public Form1(Form2 form2) : this() 
    { 
     _form2 = form2; 
    } 

    private void callForm2bt_Click(object sender, EventArgs e) 
    { 
     if (_form2 != null) 
     { 
      _form2.Show(); 
     } 
     this.Close(); 
    } 
} 

或者使用當前的方法,但不關閉Form1,而不是它的visability設置爲false,當你從它完成。通過調用this.Hide();this.Visable = false;像:

private void callForm2bt_Click(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2(); 
    form2.Show(); 
    this.Hide();//this will hide the control from the user but it will still alive. 
} 

編輯:在第一個解決方案,您還可以使用form1.ShowDialog()和傳遞Form2實例Form1構造擺脫,所以:

//At From2.Load: 
private void Form2_Load(object sender, EventArgs e) 
{ 
    this.Hide();//the form2 will hide and show the form 1. 
    Form1 form1 = new Form1(); 
    form1.ShowDialog(); 
    this.Show();//the form1 is closed so just show this again. 
} 
+1

這沒有解決處理表單和正確的初始化順序的要求。取決於應用程序,可能會或可能不會成爲問題。但是,如果一個或兩個表單使用大量內存或花費大量時間來初始化和構建,則此方法可能會成爲問題。 –

+0

在第二個解決方案中,我們沒有配置Form1,但是在第一個解決方案中調用了dispose。如果這對海報不是問題,那麼第二種解決方案更簡單。然而,因爲他在應用程序的開始時只使用Form1,然後交換到Form2,這意味着這裏的主要形式是Form2 ......但是由他來決定哪一個更合適到解決方案。 –

+0

@soumial:檢查我的答案更新。 –

0

從MSDN的Application.Run(Form)方法:
「此方法向Closed事件的mainForm參數添加事件處理程序。事件處理程序調用ExitThread清理應用程序。」
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx

基本上,當您的主窗體退出時,所有消息泵都停止。

我不知道你的真實世界的應用程序中有什麼形式,但你必須解決這個問題。一些想法 - 和正確的一個可能取決於你在做什麼:

  • 如果Form1的是某種形式的對話,你可以在上面Application.Run之前調用的ShowDialog。例如:

    static void Main() { 
        Application.EnableVisualStyles(); 
        Application.SetCompatibleTextRenderingDefault(false); 
        Form1 fm = new Form1(); 
        fm.ShowDialog(); 
        Application.Run(new Form2()); 
    } 
    

    當Form1被關閉時,Form2將被打開。 ShowDialog的返回值可用於確定是繼續並打開Form2,還是退出應用程序。

  • 另一個想法可能是調用兩次Application.Run。 Form1可以設置一個標誌,指示是否打開Form2。

通常在我的應用程序中,Form1通常是某種對話框(例如註冊表單等),所以第一個行爲通常是我所做的。如果該對話框被取消,那麼我不會運行該應用程序。

編輯:如果Form1可能分支到其他幾種形式,您可以讓它返回表單以通過字段打開到Main。例如:

  • 將一個公共字段「Form FormToOpen」添加到Form1中。表單構建時將其設置爲null。
  • 當按下Form1上的按鈕時,給FormToOpen一個值。例如:「FormToOpen = new Form2()」。
  • 更改Application.Run線如下:

    if (fm.FormToOpen != null) Application.Run(fm.FormToOpen); 
    

在這一點上,將是微不足道爲Form1有更多的按鈕,打開其他形式。主函數不需要關於每個表單的特殊知識,並且其他表單不需要關於Form1的特殊知識。