2015-10-06 40 views
0

我正在使用Visual Studio 2015的C#中的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(); 
     } 
    } 
} 

所以我Ø用代码k到打开新的形式,但我想要的代码回去,应该是一般的手段,如果我打开从MainFormSecondForm然后单击其后退按钮,我应该对MainForm但如果我打开它从任何其他形式像ThirdForm然后点击SecondForm相同的按钮,我应该对ThirdForm所以我应该在SecondForm后退按钮使用什么码?

+0

在Program.cs中,你可以创建的所有形式的实例,并使用该递增/递减的计数器前进/后退按钮单击 –

+0

,这样前面的表格,知道使自己再次看到您应该引发一个事件,并关闭下一个。编写一个使用'Stack

'的控制器类也是明智的。 –

+0

LOTSA选项!大声笑 – Glubus

回答

1

态的形式是需要记住你最后访问过的页面是。

您可以创建一个静态类(或使用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; 
    } 
} 
+0

这就是我想要的简单。 :-) –

0

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

问题的构造这里,如果你有太多的形式调用第二种形式,那么你可能最终如果有其他等维护或案件。我觉得更优雅的方式woud是通过窗体本身在constuctor像下面

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

如果你还记得每个表单的类型,你可以创建一个类型的实例,而不是切换它的名字。 – Glubus

+0

@Glubus是的..你也可以做到这一点,但无论如何,我给的只是一种做法,但正如我在我的回答中提到的,我更喜欢第二种方法,因为它避免了基于表单名称的切换,并且也避免了反射。 – Viru

+0

我知道只要认为这应该值得一提。 – Glubus

1

您可以通过调用形式参数在被调用形式的构造函数,并将其存储在一个名为form的私有变量。

SecondForm openForm= new SecondForm(this) 

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

相关问题