Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中打开上一个窗体并关闭当前窗体?_C#_Forms_Visual Studio_Class_Windows Forms Designer - Fatal编程技术网

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

如何在C#中打开上一个窗体并关闭当前窗体?,c#,forms,visual-studio,class,windows-forms-designer,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 vo

我正在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();
        }  
    }
}
第二种形式:

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();
        }  
    }
}
第三种形式:

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
后退按钮上使用什么代码?

一种方法是在第二表单的构造函数中接受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情况。我认为更优雅的方式应该是在下面的构造函数中传递形式本身

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

一种方法是在第二个表单的构造函数中接受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情况。我认为更优雅的方式应该是在下面的构造函数中传递形式本身

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

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

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

然后backbutton将隐藏它所在的任何窗体,并在静态类中显示窗体引用

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

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

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

然后backbutton将隐藏它所在的任何窗体,并在静态类中显示窗体引用

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)

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

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

SecondForm openForm= new SecondForm(this)

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

在Program.cs中,您可以创建所有窗体的实例,并使用计数器,该计数器在“前进/后退”按钮单击时递增/递减。您应该引发一个事件,以便前一个窗体知道如何再次显示并关闭下一个窗体。编写一个使用堆栈的小型控制器类也是明智的。在Program.cs中,您可以创建所有窗体的实例,并使用一个计数器,该计数器在“前进/后退”按钮单击时递增/递减。您应该引发一个事件,以便前一个窗体知道如何再次显示并关闭下一个窗体。编写一个使用
堆栈
的小型控制器类也是明智的。如果你记得每个窗体的类型,你可以创建一个该类型的实例,而不是打开它的名称。@Glubus是的。你也可以这样做,但不管怎样,我给出的只是一种方法,但正如我在回答中提到的,我更喜欢第二种方法因为它避免了基于表单名称的切换,也避免了反射。我知道,如果他决定这样做,我认为值得一提。如果你记得每个表单的类型,你可以创建该类型的实例,而不是切换其名称。@Glubus是的。你也可以这样做,但无论如何,我给出的只是一种方法但正如我在回答中提到的,我更喜欢第二种方法,因为它避免了基于表单名称的切换,也避免了反思。我知道,如果他决定这样做,我认为值得一提。简单来说,这就是我想要的。:-)我很久以前就回答过这个问题,虽然它可以工作并且实现起来非常简单,但我想补充一点,这可能不是一种非常易于维护的方法。如果您想了解如何在表单应用程序中保持状态,包括Backbutton之类的内容,我建议您阅读Microsoft自己认为您应该采取的方式。这就是我简单介绍的内容。:-)我很久以前就回答过这个问题,虽然它可以工作并且实现起来非常简单,但我想补充一点,这可能不是一种非常易于维护的方法。如果您想了解如何在表单应用程序中保持状态,包括Backbutton之类的内容,我建议您阅读Microsoft自己认为您应该采取的方式。