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()
呢?