C#打开一个新表单并关闭另一个表单

在我的程序中,我在主窗体之前显示一个登录表单,一旦程序检测到成功登录,我就用它:

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

这工作正常,但有一个问题,登录表单仍然是打开的,即使它是隐藏的,所以当程序关闭时,进程仍然挂起,我怎么能阻止这种情况发生?

对不起,忘了添加,使用this.Close(); 不起作用,将完全关闭该程序。

您需要在启动应用程序时指定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 } } 

PS Close将完全关闭您的应用程序,如果它是您的应用程序的主要forms。

尝试更像这样的东西:

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

您希望在显示对话框之前隐藏登录表单,然后在关闭对话框后关闭登录表单。

简单地关闭“登录”对话框最终将结束应用程序,因此这不是一个真正的解决方案,但您仍然希望隐藏登录。

简单地说,按照您希望它们进入的顺序放置内容,尤其是在处理消息循环时。

首先,隐藏登录表单。
接下来,显示“主窗体”对话框,但阻止“ShowDialog()”的调用者继续,直到关闭对话框。
最后,关闭对话框后,关闭登录表单,结束应用程序。

将主窗体更改为MainForm ,并在应用程序启动时,在MainForm_Load启动登录窗体中作为对话框,这样他们就无法访问主窗体。

  • 如果您需要能够从登录表单关闭应用程序,请使用Application.Exit(0);
  • 如果您不希望它们看到主窗体查找并覆盖SetVisibilityCore MainForm_Load调用它。

您可以使用ApplicationContext.MainForm指定ApplicationContext.MainForm当前主窗体:

 static class Program { public static ApplicationContext Context { get; set; } ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Context = new ApplicationContext(new LoginForm()); // pass Context instead of just new LoginForm() Application.Run(Context); } } 

然后在登录处理程序中:

 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(); } 

怎么样。 this.Close()呢?