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

时间:2012-01-23 16:03:32

标签: c# winforms

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

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

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

抱歉,忘记添加,使用this.Close();无效并将完全关闭该程序。

5 个答案:

答案 0 :(得分:10)

尝试更像这样的事情:

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

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

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

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

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

答案 1 :(得分: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
        }
    }

P.S。 Close如果它是您申请的主要形式,将完全关闭您的申请。

答案 2 :(得分:1)

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

  • 如果您需要能够从登录表单关闭应用程序,请使用Application.Exit(0);
  • 如果您不希望他们看到主表单查找并覆盖SetVisibilityCore并在 MainForm_Load内将其称为

答案 3 :(得分:1)

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

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

然后在登录处理程序中:

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

答案 4 :(得分:-1)

this.Close()呢?