如何从一个窗体打开一个新窗体

62
我有一个使用ShowDialog方法打开的表单,其中有一个名为More的按钮。 如果我们点击More,它应该打开另一个表单并关闭当前表单。
在More按钮的Click事件处理程序中,我编写了以下代码。
MoreActions objUI = new MoreActions (); 
objUI.ShowDialog();
this.Close();

但是发生的情况是,它没有关闭第一个表单。因此,我修改了这段代码为

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

这里,第二个表单被显示出来,然后在几秒钟内两个表单都被关闭。

请问有人可以帮我解决这个问题吗? 我需要做的是,如果我们点击“更多”按钮,它应该打开另一个表单并关闭第一个表单。

任何形式的帮助都将对我非常有帮助。


我认为你需要看一下Wizard,参见https://dev59.com/nEnSa4cB1Zd3GeqPSfE4。 - Saeed Amiri
14个回答

63

在我看来,主窗体应该负责打开两个子窗体。以下是一些伪代码,说明我的做法:

// 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。 - Neowizard
难道把Form.BeforeClosing事件附加上去并检查它是否由于按钮而关闭会更好吗?然后只需让更多的按钮关闭表单即可。这将比在表单上定义新事件更简洁/需要更少的代码。 - deed02392
@deed02392,如果您想在不关闭第一个表单的情况下打开下一个表单怎么办?我的解决方案是通用的,在这种情况下需要更少的更改。哦,而更短并不一定意味着更清晰 :p - Johann Blais

58
如果我理解得正确,你是想像这样做吗? alt text 变成这个样子? alt text 在你的 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.
    }

8
为什么在第一个情况下使用f2.ShowDialog(),而在第二个情况下使用f3.Show()? - superpuccio
1
对于一个线性应用程序:new Form2().Show(); - Adola

18

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

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个月前。在这种情况下,您可能希望考虑留下评论,而不是发布另一个答案。 - Forest Kunecke

7
我会用一个值来记录当“更多”按钮被按下时关闭第一个对话框,然后让原始表单测试该值并显示第三个对话框。
例如:
  1. 创建三个窗体Form1、Form2和Form3。
  2. 在Form1上添加一个按钮。
  3. 在Form2上添加两个按钮。

Form 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();
        }
    }

保留表格3的原样


3

试一下这个...

//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() 是不是必要的? - Gonzalo.-

3
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
}

2
欢迎来到 Stack Overflow。虽然您的代码可能提供了问题的答案,但请添加一些上下文说明,以便其他人了解它的作用和原因。 - Theo

2
您可以考虑这个例子。
//Form1 Window
//EventHandler
Form1 frm2 = new Form1();
{
    frm2.Show(this); //this will show Form2
    frm1.Hide();  //this Form will hide
}

0

对 Program.cs 进行以下操作

using System;

namespace ProjectName 
{
    public class Program
    {
        [STAThread]
        public static void Main(string[] args) 
        {
            Application.EnableVisualStyles();
            Application.SetDefaultCompatibleTextRendering(false);

            new Form1().Show();

            Application.Run();
        }
    }
}

0
你可以尝试添加一个布尔值,这样算法就会知道按钮何时被激活。当它被点击时,布尔值检查为真,新表单显示并关闭上一个表单。
需要知道的是,表单会消耗一些内存(至少一点),因此最好关闭那些不会使用的表单,而不仅仅是隐藏它。这在大型项目中会有所不同。

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

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