如何在C#中打开上一个窗体并关闭当前窗体?
我正在Visual Studio 2015上的C#中的Windows窗体上开发一个桌面应用程序,其中使用以下代码连接的窗体太多 第一种形式:如何在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
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自己认为您应该采取的方式。