C# 在Windows窗体应用程序中单击按钮时隐藏窗体并显示另一个窗体

C# 在Windows窗体应用程序中单击按钮时隐藏窗体并显示另一个窗体,c#,winforms,user-interface,C#,Winforms,User Interface,我正在做一个Windows窗体应用程序。首先,某个表单出现,在用户点击下一步按钮后,该表单应该被隐藏,并显示另一个表单 我试着去做。我设法隐藏了当前表单,但下一个表单无法显示 以下是我的尝试: 这是按钮的事件处理程序 private void button1_Click_1(object sender, EventArgs e) { if (richTextBox1.Text != null) { this.Visible=false; } e

我正在做一个Windows窗体应用程序。首先,某个表单出现,在用户点击下一步按钮后,该表单应该被隐藏,并显示另一个表单

我试着去做。我设法隐藏了当前表单,但下一个表单无法显示

以下是我的尝试:

这是按钮的事件处理程序

private void button1_Click_1(object sender, EventArgs e)
{
    if (richTextBox1.Text != null)
    {
        this.Visible=false;


    }
    else
        MessageBox.Show("Insert Attributes First !");
}
这是主要功能:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form2 form2 = new Form2();
    Form1 form1 = new Form1();
    form2.Hide();
    Application.Run(form1);
    while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }
}

我相信以下代码只会在
form1
关闭后运行

 while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }
为什么不从
form1
开始您的
form2

Form2 form2 = new Form2();
 private void button1_Click_1(object sender, EventArgs e)
    {
        if (richTextBox1.Text != null)
        {
            form1.Visible=false;
            form2.Show();

        }
        else MessageBox.Show("Insert Attributes First !");

    }

While语句在form1关闭之前不会执行,因为它位于主消息循环之外

将其删除并将代码的第一位更改为:

private void button1_Click_1(object sender, EventArgs e)  
{  
    if (richTextBox1.Text != null)  
    {  
        this.Visible=false;
        Form2 form2 = new Form2();
        form2.show();
    }  
    else MessageBox.Show("Insert Attributes First !");  

}
不过,这并不是实现您期望的目标的最佳方式。而是考虑设计模式。

或者,您可以实现一个自定义ApplicationContext,用于处理两个表单的生存期。这里有一个实现启动屏幕的示例,它应该会让您走上正确的道路


Application.Run()之后的任何内容都将仅在主窗体关闭时执行

您可以按如下方式处理
VisibleChanged
事件:

static Form1 form1;
static Form2 form2;

static void Main()
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    form2 = new Form2();
    form1 = new Form1();
    form2.Hide();
    form1.VisibleChanged += OnForm1Changed;
    Application.Run(form1);

}

static void OnForm1Changed( object sender, EventArgs args )
{
    if ( !form1.Visible )
    {
        form2.Show( );
    }
}
A) 主GUI线程将在调用Application.run时无休止地运行,因此永远不会到达while循环

B) 您永远不会希望有这样一个无休止的循环(while(true)循环)——它只会冻结线程。不太确定你在那里想要实现什么

我将在main方法中创建并显示“main”(初始)表单(默认情况下,visualstudio会这样做)。然后在按钮处理程序中,创建另一个窗体并显示它,同时隐藏主窗体(而不是关闭它)。然后,确保主窗体在通过事件关闭时再次显示。例如:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }    

  private void button1_Click(object sender, EventArgs e)
  {      
    Form2 otherForm = new Form2();
    otherForm.FormClosed += new FormClosedEventHandler(otherForm_FormClosed);
    this.Hide();
    otherForm.Show();      
  }

  void otherForm_FormClosed(object sender, FormClosedEventArgs e)
  {
    this.Show();      
  }
}

要链接到所需的表单,请执行以下操作:

Form2 form2 = new Form2();
        form2.show();

this.hide();

然后隐藏上一个表单

这是适合我的代码,已经足够好了

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Hide()
    Form2.Show()
End Sub

最后一节课

我可以看到他们想做什么。。。基本上运行一个循环检查对象的更改-不太面向GUI,但在某些情况下完全有效。我尝试过这样做,但问题是我应该将应用程序放在哪里。运行(form2)指令,将其放在form1中会引发异常…顺便说一句,无限循环不会导致异常,我将尝试提出异常alternatives@Nataly,我打赌那是一个NullReferenceException:)是的,事实证明form2.show()已经足够了,不需要运行应用程序,因为form1应用程序仍将运行,谢谢您的帮助answer@Nataly是的,因为你已经监督了我代码的第一行。但是不管怎样,很高兴你解决了你的问题,这是一个很好的解决问题的方法,但是当我尝试这个方法时,出现了两个错误MSG,fomr1,form2在onForm1Changed方法中没有被识别。是吗?啊,是的,我的错误,它们必须在Main()方法之外声明。我会更新代码。很抱歉好的,我已经更新了代码,但是这可能不是最好的解决方案!!
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Hide()
    Form2.Show()
End Sub