【问题标题】:Close one form and display another关闭一个表单并显示另一个
【发布时间】:2020-08-01 00:03:26
【问题描述】:

我的应用以LoginForm 开头,用户将在其中输入他们的凭据。我需要关闭LoginForm 并显示DashboardForm。我能够做到这一点:

public static bool OpenDashboardFormOnClose { get; set; }
public static bool OpenLoginFormOnClose { get; set; }

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    OpenDashboardFormOnClose = false;
    OpenLoginFormOnClose = false;

    Application.Run(new LoginForm());

    if (OpenDashboardFormOnClose)
    {
        Application.Run(new DashboardForm());
    }           

    if (OpenLoginFormOnClose)
    {
        Application.Run(new LoginForm());
    }
}

LoginForm登录方式:

Program.OpenDashboardFormOnClose = true;
this.Close();

DashboardForm注销方法:

Program.OpenLoginFormOnClose = true;
this.Close();

当用户登录然后退出时,这非常有用。 问题是当用户刚刚注销并尝试再次登录时,应用程序会关闭而不是显示DashboardForm
我如何实现这一目标?用户应该能够根据需要多次登录和退出...

感谢任何帮助。

【问题讨论】:

  • 这不是关于编码,而是更多关于你想要发生的事情,当然你不能读懂用户的想法。那你想做什么?

标签: c# windows winforms


【解决方案1】:

我真的不建议使用这种使用多个Application.Run 一个接一个地显示连续表格的方法。该方法启动程序的主消息循环,通常在程序启动时运行一次,在程序退出时仅返回一次。

取而代之的是,让表单根据需要相互打开,并让主消息循环保持不变。让我们修改它以使其恢复到几乎默认的状态:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    //Open the initial formm I'm assuming it's the login
    LoginForm loginForm = new LoginForm();
    loginForm.Show();

    //Start the main message loop for the whole lifetime of the program
    Application.Run();
}

现在,在登录表单上,当需要关闭它并启动主表单时,它会自行完成而不是委托:

//Close itself
this.Close();
//Launch the next form
DashboardForm dashboardForm = new DashboardForm();
dashboardForm.Show();

同样,在退出时您需要在仪表板上重新启动登录:

//Close itself
this.Close();
//Show the login again
LoginForm loginForm = new LoginForm();
loginForm.Show();

虽然所有这些工作都有效,但这会产生一个以前不存在的问题。由于主要的Application.Run 没有绑定到表单,一旦存在初始登录,它就不会停止运行,但只有在明确指示这样做时才会停止运行,进程的最终结果会在窗口关闭后挂起。

要修复它,当需要永久关闭应用程序(而不是启动另一个表单)时,调用Application.Exit();,可能在Form.Closing 事件中。

【讨论】:

  • 感谢您的回复,但是当this.Close()LoginForm 被调用时,Application.Exit() 也被调用,它只是关闭了应用程序。关于如何解决这个问题的任何想法?
  • 您可以设置一个标志来指示您是否自己关闭了表单以避免过早关闭整个应用程序,并且只有在您没有以编程方式关闭表单时才调用Application.Exit()
【解决方案2】:

只需使用while 循环重复显示登录和仪表板表单。您将不再需要“OpenLoginFormOnClose”标志,但需要一个来跟踪应用程序是否应该退出:

static class Program
{

    public static bool OpenDashboardFormOnClose;
    public static bool ExitApplication = false;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        while(!ExitApplication)
        {
            OpenDashboardFormOnClose = false;
            Application.Run(new LoginForm());
            if (OpenDashboardFormOnClose)
            {
                Application.Run(new DashboardForm());
            }
        }
        
    }
}

然后在您的表单中添加一个“退出”按钮:

private void btnExit_Click(object sender, EventArgs e)
{
    Program.ExitApplication = true;
    this.Close();
}

所以现在 while 循环将退出,您的程序将结束。

【讨论】:

    【解决方案3】:
    1. this.CloseClose 只是关闭当前表单,但如果它是主表单 关闭所有这些。

    2. Application.Exit() 关闭同一程序的所有窗口。

    3. 没有可能的方式来关闭主窗体。如果你在所有窗户上都这样做 从它打开会关闭。您只能隐藏表单。

    要隐藏表单,请检查下面的代码

    private void Example_Click(object sender, EventArgs, e)
    {
        this.Hide();
        this.ShowInTaskbar = false;
    }
    

    如果您在仪表板表单上,并且想要使用/或关闭所有剩余窗口,请使用

    Application.Exit();
    

    另一种许多人不使用的更简单的方法来打开表单

    new DashBoardForm().Show();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多