2011-09-26 34 views
1

我知道這個問題聽起來很愚蠢,但悲傷的情況下,我已經在網上搜索得到的解決方案,但仍然無法得到它的正確。我現在的問題是=註銷按鈕,以便退出主窗體,然後再次顯示登錄窗體。 下面的代碼在我點擊註銷按鈕後不會顯示登錄表單,它直接退出整個應用程序。註銷主窗體並顯示登錄表格

void logoutbtn_Click(object sender, EventArgs e) 
    { 
     CloseSockets(); 
     this.Close(); 
     serverlogin login = new serverlogin(); 
     login.Show(); 
    } 

所以,我嘗試更換this.Hide(),而不是this.Close();。但是,有些事情甚至會發生。是的,登錄頁面顯示在我點擊註銷按鈕後,但是當我點擊我的登錄窗體上的取消按鈕時,它並沒有退出整個應用程序,它假設退出整個應用程序。我猜是因爲主窗體只是隱藏而尚未關閉?另外,當我嘗試再次登錄時,登錄按鈕也不起作用,無法登錄到主頁面。

我對我的解釋表示歉意,請告訴我,如果它很不清楚。 請給我幫助。非常感謝。

回答

0

您需要在您的形式將在butttons被解僱定義2事件單擊並在主窗體處理:

MainForm.cs

void logoutbtn_Click(object sender, EventArgs e) 
{ 
    CloseSockets(); 
    this.Hide(); 
    serverlogin login = new serverlogin(); 

    login.Login += new EventHandler(serverlogin_Login); 
    login.Cancel += new EventHandler(serverlogin_Cancel); 

    login.Show(); 
} 

private void serverlogin_Login(object sender, EventArgs args) 
{ 
    this.Show(); 
    // do login 
} 

private void serverlogin_Cancel(object sender, EventArgs args) 
{ 
    Application.Exit(); 
    // do exit 
} 

LoginForm.cs

public event EventHandler Login; 
public event EventHandler Cancel; 

private void OnLogin() 
{ 
    if (Login != null) 
     Login(this, EventArgs.Empty); 
} 

private void OnCancel() 
{ 
    if (Login != null) 
     Login(this, EventArgs.Empty); 
} 

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    this.OnLogin(); 
} 

private void btnCancel_Click(object sender, EventArgs e) 
{ 
    this.OnCancel(); 
} 
0

當您選擇「註銷」時,您可能只想啓動應用程序的新實例,然後退出舊應用程序。這清理了仍在使用的所有資源,並且使得將數據從一個用戶會話泄漏到下一個用戶會話變得更加困難。

當然,缺點是速度會變慢,但有ngen.exe可以降低重新啓動應用的成本。

-2
private void btnLogout_Click(object sender, EventArgs e) 
    { 
     System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenLoginForm)); 
     t.Start(); 
     this.Close(); 
    } 
    public static void OpenLoginForm() 
    { 
     Application.Run(new LoginForm()); 
    } 
+1

你能解釋一下你的代碼嗎? – soundslikeodd