2012-11-05 41 views
1

在我的項目中,有兩種形式frmLoginfrmMain。從frmLogin成功登錄後,我表示做這樣的事情的frmMain形式提供給用戶:顯示與之前隱藏的形式

frmLogin形式button_click事件:

frmMain main = new frmMain(); 
main.Show(); 
this.Hide(); 

frmMain當用戶註銷我想表現出同樣的frmLogin表格(不是實例)。這個怎麼做?

我試過這段代碼:(創造frmLogin另一個例子,我不想

frmMain形式button_click事件:

if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)) 
{ 
    this.FormClosing -= frmMain_FormClosing; 
    // 
    Process p = new Process(); 
    p.StartInfo.FileName = Application.ExecutablePath; 
    p.Start(); 
    // 
    this.Dispose(); 
} 

我一直在使用internal符也嘗試過,但沒有使用。

編輯:作爲一名學員,我不允許使用Static關鍵字和改變program.cs。如果上述方法需要限制方法(我已提到),那麼請給我一個替代方法。

+0

試試這個。 http://stackoverflow.com/questions/3005732/showing-a-hidden-form – Sandeep

回答

3

所有您需要做的就是分配登錄頁面owner of nextform to be opened

在登錄頁面中調用下面要打開nextForm

void openNextForm() 
{ 
    Form f2 = new YourForm();  
    f2.owner=this; 
    f2.Show(); 
    this.Hide(); 
} 

在你nextForm(如MainForm的)函數編寫以下aginst您的按鈕點擊

void ButtonLogOut_Click(object sender, EventArgs e) 
{ 
    this.Owner.Show(); 
    this.Hide(); 
    this.Dispose(); 
} 
+0

不錯,這是工作:)謝謝 –

+0

但問題是爲什麼當你可以簡單地使用'ShowDialog()'方法時,你會寫很多額外的代碼?沒有意義。 'ShowDialog()'甚至允許你在函數調用中設置父類,而不需要編寫額外的代碼。 –

+0

@AbijeetPatro我問了一個不值得的問題(我在看到你的答案後才意識到),但爲了讓它值得,我給了它一些限制。 –

4

將frmLogin引用傳遞給frmMain。然後,在你處理frmMain之前,顯示frmLogin。

frmMain main = new frmMain(); 
main.LoginForm = this; 
main.Show(); 
this.Hide(); 

然後在按鈕單擊事件:

if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)) 
{ 
    this.FormClosing -= frmMain_FormClosing; 
    LoginForm.Show(); 
    this.Dispose(); 
} 
+0

謝謝你的迴應,我想你錯過了一些與'LoginForm'相關的東西,VS顯示紅色的塗鴉。 –

+0

好吧,我明白讓我檢查 –

+0

nope不工作..仍然顯示紅色的塗鴉 –

1

我覺得多種形式打交道時,最乾淨的方法是在Program.cs中創建它們,並把所有的方法有管理他們,然後從事件處理程序調用這些方法。有點像這樣:

static class Program 
{ 
    public static MainForm mainForm = new MainForm(); 
    public static LoginForm loginForm = new LoginForm(); 

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

    public static void Login() 
    { 
     loginForm.Hide(); 
     mainForm.Show(); 
     // probably do more here 
    } 

    public static void Logout() 
    { 
     if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))) 
     { 
      mainForm.Hide(); 
      loginForm.Show(); 
      // probably do more here 
     } 
    } 
} 

然後在事件處理程序,你可以叫Program.Login()或Program.Logout()

+0

謝謝你的迴應,這是好的,但我不能使用它。我應該在之前提到過,請查看我編輯的問題。 –

+0

你應該說服他們讓你,因爲在表單內部創建表單然後傳遞引用會變得非常混亂和容易出錯,畢竟他們是否會僱傭你編寫好的或者哈希的代碼? ;) –

1

我不明白你爲什麼不使用ShowDialog()方法?

frmMain main = new frmMain(); 
this.Hide(); 
main.ShowDialog(); 
this.Show(); 

登錄表單將被隱藏,並在主窗體關閉後,登錄表單的將繼續執行,它會自動顯示...

+0

是的,這是工作,良好的邏輯,但如果我想使用show(),而不是showDialog()。只是好奇而已。 –