如何打开上一个表格并关闭C#中的当前表格?

时间:2015-10-06 17:04:39

标签: c# forms visual-studio class windows-forms-designer

我正在使用以下代码在Visual Studio 2015上使用C#中的Windows窗体构建桌面应用程序,其中我使用以下代码在其中附加了太多表单。

第一种形式:

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

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

3 个答案:

答案 0 :(得分:3)

需要某种形式的州来记住您上次访问过的网页的内容。

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

然后一个后退按钮将隐藏它所在的任何形式,并在静态类中显示表单引用。

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

答案 1 :(得分:2)

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

SecondForm openForm= new SecondForm(this)

在后退按钮单击处理程序中,您可以再次显示调用者表单,而无需创建新实例。看起来你不是以这种方式管理对象处理。

答案 2 :(得分:0)

一种方法是在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
           }
        } 
    }
}

问题在于,如果你有太多的表单调用第二个表单,那么你可能最终会遇到其他情况或者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();