【问题标题】:C#, how to hide one form and show another?C#,如何隐藏一种形式并显示另一种形式?
【发布时间】:2014-12-26 21:36:36
【问题描述】:

当我的项目启动 Form1 时,会加载并检查服务器的程序许可证,如果一切正常,它应该:显示 Form2 并关闭 Form1。之后,当用户使用“x”关闭 Form2 时,程序应该结束。

你认为最好的方法是什么?

目前只到 form2.Show :)

...
if (responseFromServer == "OK")
{
    Form2 form2 = new Form2();
    form2.Show();
}

谢谢!

【问题讨论】:

  • 您是否要创建启动画面?
  • 类似,如果购买了程序,它会与服务器检查,如果是,则启动 Form2 并消失。
  • 您在 Form1 的 Load 事件中发布的代码是吗?

标签: c# .net winforms


【解决方案1】:

我使用这样的东西。代码在 Program.cs

public static bool IsLogged = false;

Application.Run(new FUserLogin());
if (!isLogged)
  Application.Exit();
else
Application.Run(new FMain());

【讨论】:

  • 我认为我也会这样做,虽然我会用 Form1 上的属性替换静态,但这只是我。
【解决方案2】:

您可能知道,如果您使用 Form1 作为您的主窗体,那么您将无法关闭它,因为这将关闭应用程序(除非您自定义应用程序的启动方式,但这更高级)。

一种选择是首先将 Form2 创建为主窗体,但将其隐藏,然后创建并显示 Form1,然后在完成许可证检查后,关闭 Form1 并使 Form2 可见。

或者您可以先显示 Form1,然后在完成许可证检查后,调用 Form1.Hide(),然后创建并显示 Form2。然后当 Form2 被用户关闭时,在 Form2.Closed 事件处理函数中调用Form1.Close()

class Form1
{
    private void Form1_Load(object sender, EventArgs e)
    {
        // do the license check, 
        // and then when the license check is done:
        if (responseFromServer == "OK")
        {
           Form2 form2 = new Form2();
           Form2.FormClosed += new FormClosedEventHandler(Form2_FormClosed);
           Form2.Show();
           this.Hide();
       }
       else
           this.Close();
    }


    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close(); // will exit the application     
    }
}

【讨论】:

    【解决方案3】:

    您可以使用 ShowDialog 显示第一个表单,它会一直阻塞直到表单关闭。在 Form1 中,您可以在完成处理后调用 this.Close() ,然后设置 DialogResult 属性,或者(可能更简洁)您可以创建 Form1 在关闭之前设置的公共属性,并让调用者检查它。然后您可以直接从 Main 返回,或者继续实例化您的新类并将其传递给 Application.Run()。

    static class Program
    {
      [STAThread]
      static void Main()
      {
        var form1 = new Form1();
        var result = from1.ShowDialog(); // Form1 can set DialogResult, or another property to indicate success
    
        if (result != DialogResult.OK) return; // either this
        if (!form1.ValidationSuccessful) return; // or this
    
        Application.Run(new Form2());
      }
    }
    

    我喜欢这样,因为您没有从 Form1 引用 Form2,所有用于处理显示 Form1 和退出应用程序的代码都合并在一个地方,并且可以很容易地被注释掉以进行开发或测试。

    【讨论】:

    • 不错。我没有意识到 Form.ShowDialog() 创建了它自己的消息循环。这很酷。 +1
    【解决方案4】:

    试试这个隐藏Form1:

    this.Hide();
    

    然后在 Form2 的 FormClosing 事件中:

    Form2_FormClosing(object sender, EventArgs e)
    {
        Application.Exit();
    }
    

    【讨论】:

    • 如果不需要再次显示表单,不确定这是不是最好的方法。
    • >>> Application.Exit();这适用于杀死整个应用程序。谢谢!
    【解决方案5】:

    试试这个

    //Form1 code
    if (responseFromServer == "OK")
    {
    this.Hide();
    Form2 frm = new Form2();
    frm.Show();
    }
    

    并且您可以在 Form2 的表单关闭事件中使用 Application.Exit() 方法退出应用程序

    【讨论】:

      【解决方案6】:
      //Login Form Load Events or Constructor
      this.Close(); //first Close Login From               
      Application.Run(new Main());//second Run Main Form
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 2016-04-04
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多