C#如何打开上一个窗体,关闭当前窗体?

How To Open The Previous Form And Close The Current In C#?

我正在 Visual Studio 2015 年开发基于 Windows C# 表单的桌面应用程序,其中使用以下代码在其中附加了太多表单。

第一种形式:

using System;
namespace MyApps
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        private void btnForward_Click(object sender, EventArgs e)
        {
            SecondForm openForm= new SecondForm();
            openForm.Show();
            this.Hide();
        }  
    }
}

第二形式:

using System;
namespace MyApps
{
    public partial class SecondForm: Form
    {
        public SecondForm()
        {
            InitializeComponent();
        }
        private void btnBack_Click(object sender, EventArgs e)
        {
            // +++++++++++ Need To Write The UPDATED Code Here +++++++++++
            MainForm openForm= new MainForm();
            openForm.Show();
            this.Hide();
        } 
    }
}

第三种形式:

using System;
namespace MyApps
{
    public partial class ThirdForm: Form
    {
        public ThirdForm()
        {
            InitializeComponent();
        }
        private void btnForward_Click(object sender, EventArgs e)
        {
            SecondForm openForm= new SecondForm();
            openForm.Show();
            this.Hide();
        }  
    }
}

所以我可以使用打开新表单的代码,但我希望代码返回,如果我从 MainForm 打开 SecondForm 然后单击其返回,这应该是一般的意思按钮,我应该在 MainForm 但如果我从 ThirdForm 等任何其他形式打开它,然后在 SecondForm 上单击相同的按钮,我应该在 ThirdForm 所以怎么办我应该在 SecondForm 后退按钮上使用代码吗?

一种方法是在 Second Form 的构造函数中接受 FormType

using System;
namespace MyApps
{
    public partial class SecondForm: Form
    {
        private string _formType;
        public SecondForm()
        {
            InitializeComponent();
        }
        public SecondForm(string FormType):this()
       {
          _formType = FormType;
        }
        private void btnBack_Click(object sender, EventArgs e)
        {
            // +++++++++++ Need To Write The UPDATED Code Here +++++++++++
             if(string.IsNullorEmpty(_formType) || _formType.Equals("MainForm"))
          {
            MainForm openForm= new MainForm();
            openForm.Show();
            this.Hide();
           }
           else
           { 
              // code to open third form
           }
        } 
    }
}

这里的问题是,如果您有太多调用第二个表单的表单,那么您最终可能会遇到 if else 或 swtich 情况。我认为更优雅的方法是像下面这样在构造函数中传递 Form 本身

using System;
    namespace MyApps
    {
        public partial class SecondForm: Form
        {
            private Form _previousForm;
            public SecondForm()
            {
                InitializeComponent();
            }
            public SecondForm(Form form):this()
           {
              _previousForm = form;
            }
            private void btnBack_Click(object sender, EventArgs e)
            {


                                _previousForm.Show();
                this.Hide();

            } 
        }
    }

从第三或主要形式你可以这样做

 SecondForm form = new SecondForm(this);
     form.Show();
     this.Hide();

需要某种形式的状态来记住您上次访问的页面是什么。

您可以创建一个静态 class(或使用 Program.cs),它有一个名为 PreviousPage 的静态成员。每次单击新表单按钮时,都会对其进行适当更新。

然后后退按钮将隐藏它所在的任何表单,并在您的静态 class.

中显示表单引用
public static class FormState
{
     public static Form PreviousPage;
}

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }
    private void btnForward_Click(object sender, EventArgs e)
    {
        SecondForm openForm= new SecondForm();
        openForm.Show();
        this.Hide();
        FormState.PreviousPage = this;
    }  

    private void btnBack_Click(object sender, EventArgs e)
    {
         FormState.PreviousPage.Show();
         this.Hide();
         FormState.PreviousPage = this;
    }
}

您可以将调用表单作为参数传递给被调用表单的构造函数,并将其存储在被调用表单的私有变量中。

SecondForm openForm= new SecondForm(this)

在后退按钮单击处理程序中,您可以再次显示调用方表单,而无需创建新实例。不过,您似乎没有以这种方式管理对象处理。