2012-01-24 142 views
1

請原諒我,如果這個問題是其他人的重複,我可能不知道如何正確地說出我的問題,這就是爲什麼我找不到合適的答案。C#線程:如何在線程關閉後打開主窗體

我有一個winforms C#應用程序與多種形式。我的主要形式是一個登錄表單,它是一個首先加載的啓動畫面。我的問題是,無論何時單擊註銷,我都希望它返回到登錄屏幕。但是,啓動屏幕加載並不再打開登錄表單。

我懷疑這是因爲我啓動了一個新線程才能關閉mainform並打開下一個表單?我在某處讀過它,因爲僅僅使用main.close()和form1.show()時會發生錯誤。幫幫我?

SPLASH屏幕代碼

public SplashScreen() 
{ 
    InitializeComponent(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    progressBar1.Increment(1); 
    if (progressBar1.Value == 100) timer1.Stop(); 
} 

LOGIN START

public LOGIN() 
{ 
    Thread t = new Thread(new ThreadStart(SplashScreen)); 
    t.Start(); 
    Thread.Sleep(5000); 
    InitializeComponent(); 
    t.Abort(); 
} 

public void SplashScreen() 
{ 
    Application.Run(new SplashScreen()); 
} 

LOGIN EXIT(重定向到用戶的主頁)

public static void OpenHomeAdmin() // new thread to open home ADMIN 
{ 
    Application.Run(new Home_Admin()); 
} 

if (usertype == "UT1") //admin rights 
{ 
    //GET LOGGED USER 
     Home_Admin homeAdmin = new Home_Admin(); 
     homeAdmin.SetUsername(username); 

     this.Close(); 
     System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenHomeAdmin)); 
     t.Start(); 
} 
+0

'Application.Run(Form)'用於在當前線程上運行新的應用程序。這是你的意圖嗎?你只是想顯示新的表單? –

+0

@mhornfeck我只想關閉我的主窗體,然後打開另一個窗體。 – RMSP

+0

您可以將處理單擊事件的代碼發佈到註銷嗎? –

回答

0

我不相信你需要開始一個新的線程才能打開/關閉你的表單。試試下面的代碼來代替:

if (usertype == "UT1") //admin rights 
{ 
    //GET LOGGED USER 
     Home_Admin homeAdmin = new Home_Admin(); 
     homeAdmin.SetUsername(username); 

     this.Hide(); 
     homeAdmin.Show(); 
} 

注意Form.Close()將部署Form對象,這意味着該對象中創建的所有資源都關閉爲好。 Read more hereForm.Hide()將從用戶的視圖中隱藏表單。

+0

如果我這樣做,我的啓動畫面不再顯示。我的啓動畫面的執行是否也不正確?我使用了線程:| – RMSP

+1

我不認爲這是一個很好的方法來做到這一點。 [只使用Thread.Abort()作爲最後的手段](http://stackoverflow.com/q/421389/213159)。我會在SplashScreen窗體中使用一個Timer,它在5秒後關閉窗體。 –

1

我也有同樣的要求,我寫了下面的代碼!

在主下Program.cs的()

Application.Run(new Splash()); //Splash Screen if u wanna run BEFORE Login Form 

/*Showing Login Form Before Entering the Main Form [Authentication]*/ 

login f1 = new login(); 
DialogResult dr = f1.ShowDialog(); 
if (dr == DialogResult.OK) 
{    
    Application.Run(new Splash()); //Splash Screen if u wanna run AFTER Login Form 
    Application.Run(new Home_Admin()); 
} 
else 
{ 
    Application.Exit(); 
} 

登錄表單 - 滿足認證後,寫了下面的代碼

this.DialogResult = DialogResult.OK; 
this.Close(); 

這將關閉你的登錄表單,並回到Program.cs,然後加載你的Home_Admin。

Home_Admin作出註銷按鈕,並在click_event

this.Close(); 
login f1=new login(); 
f1.Show(); 

現在ü會被註銷寫下面的代碼和u會回來的登錄屏幕。

注意:不要使用this.Close();在主窗體中,這可能會退出您的應用程序。你可以使用this.Hide();在這樣的追逐中。

希望這將幫助美國 試試這個,並回來與您的意見。