2013-06-11 63 views
0

我正在創建登錄功能。驗證密碼後,主窗體將被調用。 下面是部分代碼:C# - 顯示新表單後無法關閉舊錶單

Login.cs

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    //Interaction with Database 
    Main.Show(); 
    this.Close(); 
} 

如我所料只登錄窗體將被關閉,主要形式將維持不變。

但是,在執行最後一個命令後,它們都關閉。

我該如何解決這個問題?

+0

看起來你可能正在關閉主執行線程。 –

+1

在你的program.cs中哪些表單是在Application.Run(new what ??); –

+0

我想先謝謝你們,因爲我很驚訝我能從你那裏得到如此多的回覆。我同意Servy提到的替代方法很好,適用於這種情況(將登錄表單視爲主表單的對話框),但似乎並沒有從根本上解決問題:如果現在我得到3個表單,分別命名爲A,B和C;在A中,我們有兩個按鈕,單擊其中一個將跳轉到B或C.顯然,在這種情況下,我們無法預測用戶的選擇,最終我想知道如何獨立關閉舊窗體。 –

回答

3

在你的Program.cs在Application.Run(main);

然後在main.load事件中使用顯示的對話框打開你的登錄表單:而不是關閉的,你可以隱藏你的主要形式。

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Main()); 
} 

和主要

public Main() 
{ 
    InitializeComponent(); 
    Login p = new Login(); 
    DialogResult dr = p.ShowDialog(); 
    if (dr == DialogResult.OK) 
    { 
     //... 
    } 
    else 
     Application.Exit(); 
} 
+0

您還需要隱藏主窗體,因爲它不在後臺。 – Servy

+0

登錄是模式。所以它可以主要顯示在背景上。 –

+0

您不希望在用戶提供所述憑證之前顯示所需憑證的信息,否則請求憑證有什麼意義? – Servy

0

如果關閉主窗體,應用程序將終止。把

this.Hide(); 
+0

您不希望隱藏整個應用程序的登錄表單。 – Servy

0
private void btnLogin_Click(object sender, EventArgs e) 
{ 
    // hide main form 
    this.Hide(); 

    // show other form 
    Form2 form2 = new Form2(); 
    form2.Show(); 

    // close application 
    this.Close(); 
} 
+0

你不想讓整個應用程序隱藏登錄表單。 – Servy

0

如果打開Program.cs文件,你會看到類似下面的命令:

Application.Run(new PasswordForm()); 

在此命令中指定的形式是什麼將程序關聯存在,當這個表單關閉STA線程時繼續執行,然後結束,關閉整個應用程序通貨膨脹。

爲了解決這個問題,創建你的密碼形式的實例,並盡一切在Program.cs文件調用Application.Run主UI形式之前。