【问题标题】:How to open a new form from another form如何从另一个表单打开一个新表单
【发布时间】:2011-04-27 06:35:27
【问题描述】:

我有使用 ShowDialog 方法打开的表单。在这种形式中,我有一个名为“更多”的按钮。 如果我们点击更多,它应该会打开另一个表单并关闭当前表单。

在 More Button 的 Click 事件处理程序上,我编写了以下代码

MoreActions objUI = new MoreActions (); 
objUI.ShowDialog();
this.Close();

但是正在发生的事情是,它并没有关闭第一个表单。所以,我把这段代码修改为

MoreActions objUI = new MoreActions (); 
objUI.Show();
this.Close();

在这里,第二个表单正在显示,并且在几秒钟内两个表单都关闭了。

谁能帮我解决问题。我需要做的是,如果我们点击更多按钮,它应该打开另一个表单并关闭第一个表单。

任何形式的帮助都会对我很有帮助。

【问题讨论】:

标签: c# .net winforms .net-2.0


【解决方案1】:

在我看来,主窗体应该负责打开两个子窗体。这是一些解释我会做什么的伪代码:

// MainForm
private ChildForm childForm;
private MoreForm moreForm;

ButtonThatOpenTheFirstChildForm_Click()
{
    childForm = CreateTheChildForm();
    childForm.MoreClick += More_Click;
    childForm.Show();
}

More_Click()
{
    childForm.Close();
    moreForm = new MoreForm();
    moreForm.Show();
}

您只需要在第一个孩子中创建一个简单的事件 MoreClick。这种方法的主要好处是您可以根据需要对其进行复制,并且可以非常轻松地为某种基本工作流程建模。

【讨论】:

  • 在winforms中使用事件来操作GUI是所有“智能”东西的基础。活动绝对是去这里的方式+1
  • 附加到Form.BeforeClosing 事件并检查它关闭的原因是否是由于按钮不是更好 - 然后让更多按钮关闭表单?与在表单上定义新事件相比,这将更简洁/需要更少的代码。
  • @deed02392,如果在某些时候您想打开下一个表单而不关闭第一个表单怎么办?我的解决方案是通用的,在这种情况下需要较少的更改。哦,更短并不一定意味着更干净:p
【解决方案2】:

如果我没听错,你会这样尝试吗?

喜欢这个吗?

在您的 Form1 中,将此事件添加到您的按钮中:

    // button event in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog(); // Shows Form2
    }

然后,在您的 Form2 中,在您的按钮中添加此事件:

    // button event in your Form2
    private void button1_Click(object sender, EventArgs e)
    {
        Form3 f3 = new Form3(); // Instantiate a Form3 object.
        f3.Show(); // Show Form3 and
        this.Close(); // closes the Form2 instance.
    }

【讨论】:

  • 为什么要使用 f2.ShowDialog();在第一种情况下和 f3.Show() 在第二种情况下?
  • 对于一个线性:new Form2().Show();
【解决方案3】:

好的,所以我使用了这个:

public partial class Form1 : Form
{
    private void Button_Click(object sender, EventArgs e)
    {
        Form2 myForm = new Form2();
        this.Hide();
        myForm.ShowDialog();
        this.Close();
    }
}

这似乎工作正常,但第一个表单只是隐藏了,它仍然可以生成事件。 "this.Close()" 是关闭第一个表单所必需的,但如果您仍然希望表单运行(而不是像启动器一样),您必须将其替换为

this.Show();

祝你好运!

【讨论】:

  • 这个问题已经选择了一个答案,并且它最后一次处于活动状态是在 6 个月前。您可能需要考虑在这种情况下发表评论,而不是发布另一个答案。
【解决方案4】:

我会使用一个在按下更多按钮关闭第一个对话框时设置的值,然后让原始表单测试该值,然后显示那里的对话框。

前任

  1. 创建三个窗口
  2. 表格 1 表格 2 表格 3
  3. 向 Form1 添加一个按钮
  4. 向 form2 添加两个按钮

表格1代码

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

    private bool DrawText = false;

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog();
        if (f2.ShowMoreActions)
        {
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }

    }

Form2代码

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

        public bool ShowMoreActions = false;
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMoreActions = true;
            this.Close();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }

保持 form3 不变

【讨论】:

    【解决方案5】:

    试试这个..

    //button1 will be clicked to open a new form
    private void button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;     // this = is the current form
        SignUp s = new SignUp();  //SignUp is the name of  my other form
        s.Visible = true;
    }
    

    【讨论】:

    • SignUp.Show() 不是必需的吗?
    【解决方案6】:

    你可以考虑这个例子

    //Form1 Window
    //EventHandler
    Form1 frm2 = new Form1();
    {
        frm2.Show(this); //this will show Form2
        frm1.Hide();  //this Form will hide
    }
    

    【讨论】:

      【解决方案7】:
      private void Button1_Click(object sender, EventArgs e)
      {
          NewForm newForm = new NewForm();    //Create the New Form Object
          this.Hide();    //Hide the Old Form
          newForm.ShowDialog();    //Show the New Form
          this.Close();    //Close the Old Form
      }
      

      【讨论】:

      • 欢迎来到 Stack Overflow。虽然您的代码可能会提供问题的答案,但请在其周围添加上下文,以便其他人了解它的作用以及它存在的原因。
      【解决方案8】:

      例如,您有一个名为Button1Button。首先点击它会打开那个Button2EventHandler来调用另一个Form你应该在你的Button上写下下面的代码。

      your name example=form2.
      
      form2 obj=new form2();
      
      obj.show();
      

      要关闭form1,请编写以下代码:

      form1.visible=false; 要么 form1.Hide();

      【讨论】:

        【解决方案9】:

        您可以尝试添加一个布尔值,以便算法知道按钮何时被激活。当它被点击时,布尔值检查为真,新表单显示并且最后一个被关闭。

        重要的是要知道表单会消耗一些内存(至少是一点点),所以最好关闭那些你不会使用的内存,而不是仅仅隐藏它。在大型项目中发挥作用。

        【讨论】:

          【解决方案10】:

          您需要从主窗体控制子窗体的打开。

          在我的情况下,我在启动 form1 之前先打开一个登录窗口。我从 Program.cs 控制一切。在 Program.cs 中设置验证标志。从 Program.cs 打开登录窗口。然后控制进入登录窗口。然后,如果验证良好,则从登录窗口将验证标志设置为 true。现在您可以安全地关闭登录窗口。控制权返回 Program.cs。如果验证标志为真,则打开 form1。如果验证标志为 false,您的应用程序将关闭。

          在 Program.cs 中:

             static class Program
              {
                  /// <summary>
                  /// The main entry point for the application.
                  /// </summary>
                  /// 
          
                  //Validation flag
                  public static bool ValidLogin = false;
          
                  [STAThread]
                  static void Main()
                  {
                      Application.EnableVisualStyles();
                      Application.SetCompatibleTextRenderingDefault(false);
          
          
                      Application.Run(new Login());
          
                      if (ValidLogin)
                      {
                          Application.Run(new Form1());
                      }
                  }
          
              }
          

          在 Login.cs 中:

                 private void btnOK_Click(object sender, EventArgs e)
                  {
                      if (txtUsername.Text == "x" && txtPassword.Text == "x")
                      {
                          Program.ValidLogin = true;
                          this.Close();
                      }
                      else
                      {
                          MessageBox.Show("Username or Password are incorrect.");
                      }
                  }
          
                  private void btnExit_Click(object sender, EventArgs e)
                  {
                      Application.Exit();
                  }
          

          【讨论】:

            【解决方案11】:

            使用 this.Hide() 代替 this.Close()

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-25
              • 1970-01-01
              • 2015-08-12
              • 2020-08-04
              • 2015-03-08
              • 2016-05-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多