2012-01-23 118 views
8

在我的節目我秀的主要形式之前登錄表單,一旦程序檢測登錄成功我用這個:C#打開一個新的形式和關閉另一個

MainForm Main = new MainForm(); 
Main.Show(); 
this.Hide(); 

這工作得很好,但有一個問題,登錄表單仍然是開放的,即使它是隱藏的,所以當程序關閉時,進程仍然掛起,我怎麼能阻止這種情況發生?

對不起,忘了添加,使用this.Close();不起作用,會完全關閉程序。

+0

嘗試this.close() –

回答

8

您需要在應用程序開啓時指定您的MainForm,並在此表單的Load事件處理程序中請求登錄。在這種情況下,你已經在拼命地跑開始應用和Login爲:

Program.cs的

Application.Run(new MainForm()); 

MainForm.cs

private void Form1_Load(object sender, EventArgs e) 
    { 
     LoginForm loginForm = new LoginForm(); 
     if (loginForm.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      // check login here 
     } 
    } 

附:如果它是你應用程序的主要形式,那麼Close將完全關閉你的應用程序。在登錄處理

static class Program 
{ 
    public static ApplicationContext Context { get; set; } 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Context = new ApplicationContext(new LoginForm()); 
     // pass Context instead of just new LoginForm() 
     Application.Run(Context); 
    } 
} 

然後在:

+1

如果隱藏的MainForm在它的負載事件顯示登錄表單之前,您將更密切地複製首先打開登錄表單的用戶功能。 – Servy

-1

this.Close()怎麼辦?

1

將主窗體更改爲MainForm,並且當應用程序啓動時,在您的MainForm_Load啓動登錄窗體中作爲對話框,使他們無法訪問主窗體。

  • 如果您需要能夠從登錄表單關閉應用程序,使用Application.Exit(0);
  • 如果你不希望他們看到的主要形式查找和替換SetVisibilityCore,並調用它MainForm_Load
10

嘗試更多的東西是這樣的:

this.Hide(); 
Main.ShowDialog(); 
this.Close(); 

你想隱藏的登錄表單顯示您的對話框之前,然後關閉登錄表單對話框關閉後。

簡單地關閉登錄對話框最終會結束應用程序,所以這不是一個真正的解決方案,但你仍然想隱藏登錄。

簡而言之,請按照您希望他們進入的順序進行操作,特別是在處理消息循環時。

首先,您隱藏登錄表單。
接下來,您將顯示主窗體對話框,但阻止「ShowDialog()」的調用者繼續,直到對話框關閉。
最後,關閉對話框後,關閉登錄表單,結束應用程序。

1

您可以使用ApplicationContext.MainForm指定當前主要形式爲應用程序

private void login_Click(object sender, EventArgs e) 
{ 
    Program.Context.MainForm = new MainForm(); 

    // close login form 
    this.Close(); 

    // set up context to track main form instead of login 
    Program.Context.MainForm.Show(); 
} 
相關問題