2011-02-25 136 views
1

我有一个c#窗体窗体应用程序,其中包含几种形式。c#窗体窗体应用程序窗体问题

一般情况下,例如,在Form1,创建和窗口2的一个实例,然后

form1.hide(); 
form2.show(); 

但有时我想以前的形式来显示和处理当前的形式。我怎样才能打电话给以前的表格?

在此先感谢。

回答

4

要回答你的问题,你需要在你的视图中保持对彼此的引用。虽然这可能工作,它是混乱和容易出错。这听起来像你所有的控制逻辑可能包含在你的表单类代码中,我建议你远离这个并分离你的关注点。

解决您的表单管理问题变得非常简单,如果您创建一个控制器类,至少可以以您认为合适的方式管理表单的创建和处理。

所以您的代码示例实际上从一个控制器类推出,是这样的:

public class FormsController 
{ 
    private Form form1 = new Form(); 
    private Form form2 = new Form(); 

    public void SwitchForms() 
    { 
     form1.hide(); 
     form2.show(); 
    } 
} 

为了进一步熏陶结账MVC architectural pattern与数据,BIZ逻辑和UI清洁工作。

+1

非常真实。我在Program.cs中处理这个问题的建议是MVC方法的一个非常非常简单的版本,它是处理问题的更好方法。 – digitlworld 2011-02-25 19:01:26

+0

@Digit:由于OP没有提到模型,所以MVC在这里有一些延伸,但Program.cs当然可以用作简单的控制器。在引导之外,我倾向于尽可能少地使用Program.cs,因为将源代码编入源代码会使所有内容变得笨拙混乱,并且变得非常难以重构。 – 2011-02-25 19:05:17

1

您可能会考虑扩展Form以包含一些允许您访问其他表单的属性/字段。 Form类可以像大多数其他.Net类一样继承。

如果这两个表格都不是真的应该是另一个的孩子,你也可以考虑在Program.cs文件中做一些管理。

如果您从Form继承了您的form1的新类并添加了类似closeSecondForm的方法,则可以关闭它并处理第二个表单。

有可能是一堆不同的方式来解决这个问题。这些才一点点。

1

如果您将新表单的所有者设置为对当前表单的引用,则可以从新表单中引用该所有者。您也可以从旧窗体订阅新窗体的Closed()事件,并使用代码来处置它(尽管表单可以通过覆盖OnClosed来处置它,如果它没有发生的话)。

+0

哦,我很笨。我忘了父母。 – digitlworld 2011-02-25 19:00:27

0
Form2 myform = new Form2(); 

myform.show(); 
this.hide(); 
0

你可以在Form1做到这一点:

... 
var form2 = new form2(); 
form2.Closing += (form2_Closing); 
this.hide(); 
form2.show(); 
... 


private void form2_Closing(object sender, System.EventArgs e) 
{ 
    this.show(); 
} 
+1

处置太晚,该应用程序将失去焦点到另一个应用程序。 FormClosing是正确的。 – 2011-02-25 19:24:36

+0

提示使用,谢谢。 – 2011-02-25 20:01:58

1

这个逻辑应该在Program.cs处理。 Main()方法初始化Form1。你想控制那里,而不是将控制权交给表单。

例子:

Program.MyForm1.Show(); 
Program.MyForm2.Hide(); 

如果您打算采取多种形式/复杂的逻辑,我建议把这个:

static class Program 
{ 
    internal static Form1 MyForm1; 
    internal static Form2 MyForm2; 
    /// 
    /// The main entry point for the application. 
    /// 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     //Application.Run(new Form1()); 

     // Initialize Form1 
     MyForm1 = new Form1(); 
     MyForm1.FormClosing += new FormClosingEventHandler(MyForm1_FormClosing); 

     // You may want to initialize Form2 on-demand instead of up front like here. 
     MyForm2 = new Form1(); 
     MyForm2.FormClosing += new FormClosingEventHandler(MyForm2_FormClosing); 

     // Show Form1 first 
     MyForm1.Show(); 

     // Now we need to occupy the thread so it won't exit the app. This is normally the job of Application.Run. 
     // An alternative to this is to have a third form you pass on control to. 
     while (true) 
     { 
      Application.DoEvents(); 
      System.Threading.Thread.Sleep(10); 
     } 
    } 

    static void MyForm1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Do something, for example show Form2 
     MyForm2.Show(); 

     // EXAMPLE: We only want to hide it? 
     e.Cancel = true; 
     MyForm1.Visible = false; 
    } 
    static void MyForm2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Do something, for example show Form1 
     MyForm1.Show(); 

     // EXAMPLE: We only want to hide it? 
     e.Cancel = true; 
     MyForm2.Visible = false; 
    } 
} 

由于计划是静态的,你可以通过访问MyForm1MyForm2在该项目中的任何地方到一个单独的班级。另外考虑使用单个窗体并在其中旋转用户控件。

+1

使用'Application.Run()',而不是循环中的DoEvents和Sleep! – Tergiver 2011-02-25 20:05:00