Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#,如何隐藏一个窗体并显示另一个窗体?_C#_.net_Winforms - Fatal编程技术网

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

C#,如何隐藏一个窗体并显示另一个窗体?,c#,.net,winforms,C#,.net,Winforms,当我的项目启动Form1时,加载并与服务器检查程序许可证,如果一切正常,它应该:显示Form2并关闭Form1。之后,当用户用“x”关闭Form2时,程序应该结束 你认为最好的方法是什么 到目前为止,只到了form2。Show:) 谢谢 尝试此操作以隐藏Form1: this.Hide(); 然后在Form2的FormClosing事件中: Form2_FormClosing(object sender, EventArgs e) { Application.Exit(); } 试试

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

你认为最好的方法是什么

到目前为止,只到了form2。Show:)


谢谢

尝试此操作以隐藏Form1:

this.Hide();
然后在Form2的FormClosing事件中:

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

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

您可以使用Form2的表单关闭事件中的application.exit()方法退出应用程序。代码位于Program.cs中

public static bool IsLogged = false;

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

您可能知道,如果使用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     
    }
}

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


我喜欢这一点,因为您不是从Form1中引用Form2,所有用于显示Form1和退出应用程序的代码都整合在一个地方,并且可以很容易地注释掉以供开发或测试。

您是否尝试创建初始屏幕?有点像,它会与服务器检查程序是否已购买(如果是),启动Form2并消失。您在加载事件中发布的代码是否在Form1上?如果表单不需要再次显示,则不确定这是最佳方式。>>>Application.Exit();这可以杀死整个应用程序。谢谢我想这也是我应该做的,虽然我会用Form1上的属性替换static,但那只是我自己。我没有意识到Form.ShowDialog()创建了自己的消息循环。那很酷+1.
//Login Form Load Events or Constructor
this.Close(); //first Close Login From               
Application.Run(new Main());//second Run Main Form
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());
  }
}
//Login Form Load Events or Constructor
this.Close(); //first Close Login From               
Application.Run(new Main());//second Run Main Form