2012-01-23 86 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(); 
} 
相关问题