C#,如何隐藏一个窗体并显示另一个窗体?

3
当我的项目开始时,Form1会加载并与服务器检查程序许可证,如果一切正常,它应该:显示Form2并关闭Form1。之后,当用户使用“x”关闭Form2时,程序应该结束。
你认为最好的方法是什么?
到目前为止,只有form2.Show :)
...
if (responseFromServer == "OK")
{
    Form2 form2 = new Form2();
    form2.Show();
}

谢谢!


你是想要创建一个启动画面吗? - Mr. Mr.
它会与服务器进行检查,以确定程序是否已购买,如果是,则启动 Form2 并消失。 - Roger
你发布的代码是在Form1的Load事件中吗? - DoctorMick
6个回答

5
我使用类似于这样的代码。代码在 Program.cs 中。
public static bool IsLogged = false;

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

我认为这也是我会这样做的方式,尽管我会用 Form1 上的属性替换静态属性,但那只是我的个人观点。 - DoctorMick

5

如果您将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 - Igby Largeman

2

尝试以下方法来隐藏Form1:

this.Hide();

然后在Form2的FormClosing事件中:

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

1
如果表单不需要再次显示,我不确定这是否是最佳方法。 - DoctorMick
Application.Exit(); 这个方法可以用来关闭整个应用程序。谢谢!
- Roger

1

试试这个

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

你可以在Form2的窗体关闭事件中使用Application.Exit()方法退出应用程序


1
//Login Form Load Events or Constructor
this.Close(); //first Close Login From               
Application.Run(new Main());//second Run Main Form

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接