【问题标题】:How to switch forms in C# using a button event如何使用按钮事件在 C# 中切换表单
【发布时间】:2020-05-08 16:53:35
【问题描述】:

我这里有一些代码:

private void button1_Click(object sender, EventArgs e)
{
    Application.Run(new Form3());
}

虽然我不认为这就是你改变表单的方式,但当我运行它时,它抛出了一个错误:

在 a 上启动第二个消息循环 单线程不是有效操作

【问题讨论】:

标签: c# .net winforms


【解决方案1】:

您不能使用Application.Run - 用于启动 windows 窗体应用程序(在应用程序中的所有窗体之间共享的内部消息循环),而不是用于显示窗体。每个表单都有ShowHide 方法,因此您只需调用:

private void button1_Click(object sender, EventArgs e)
{
    Form3 f = new Form3(); // This is bad
    f.Show();
}

但是你不应该在每次想要展示的时候都创建表单。如果您只想拥有表单的一个实例,则应将其保持为全局并且仅按需显示或隐藏它。否则你将不得不调用Close 而不是Hide 来清除表单消耗的所有资源。

【讨论】:

    【解决方案2】:

    你可以做的很简单:

    test mp = new test();
    mp.Text = " Welcome Mr." + textBox1.Text;
    this.Hide();
    mp.ShowDialog();
    this.Close();
    

    test 是你的新表单 然后,如果您希望将变量传递给其他形式,只需将您的变量设为公开,那么您就可以制作:

     mp.Text = " Welcome Mr." + textBox1.Text;
    

    然后 showdialog 显示您的新表单并关闭旧表单..

    【讨论】:

      【解决方案3】:

      您的第一个表单应在第一次使用时创建第二个表单并将其自身隐藏起来。然后第二个表单将隐藏自己并在您切换回来时显示第一个表单。像这样的...

        private Form _firstForm;
        private Form _secondForm;
      
        private void switchToSecond_Click(object sender, EventArgs e)
        {    
            if (_secondForm == null)
                _secondForm = new SecondForm();
      
            Hide();
            _secondForm.Show();
        }
      
        private void switchToFirst_Click(object sender, EventArgs e)
        {    
            Hide();
            _firstForm.Show();
        }
      

      您将在第一个表单类的构造函数中为 firstForm 分配 this 值,因为这是主表单,所以它总是在应用程序启动时创建。如果您想节省资源,您还可以在切换回第一个表单时处理第二个表单,并在每次切换时重新创建它。

      【讨论】:

        【解决方案4】:
        this.Hide(); // Hide the current form.
        
        Menu menu = new Menu(); // Create new instance of the new form.
        
        menu.Show(); // Show it
        

        【讨论】:

          【解决方案5】:

          假设您有Form1Form2 如果您愿意,您的范围不清楚

          1. Form1Form2 之间切换并保持它们都活着。

          2. 一次只保留Form1Form2

          对于案例 1,简单的 Form1.Hide() and Form2.Show() 就足够了。

          对于案例 2,解决方案会有点复杂。

          1. 创建您自己的ApplicationContext MyAppCxt= new ApplicationContext() 实例。
          2. 而不是默认的Program.Run(Form1) 调用Program.Run(MyAppCxt(Form1))
          3. 在一些事件的处理程序中,当你需要切换Form1Form2

            Form2 f2 = new Form2();//Create the new form MyAppCxt.MainForm = f2;//set Form2 as MainForm in the message queue Form2.Close()//Close Form2 and release all the resource F2.Show();//display Form2 to the user

          当需要在Form2Form1 之间切换时,会重复相同的场景

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-12
            • 2014-02-07
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            • 2012-05-19
            • 2022-11-10
            相关资源
            最近更新 更多