跳跃形式

跳跃形式

问题描述:

之间我们可以访问窗体2Form1中通过这种方式:跳跃形式

在Form1:

private buttonForm1_click(object sender,EventArgs e) 
{ 
Form2 frm2 = new Form2() 
frm2.show() 
this.hide() 
} 

并在窗体2,我们希望访问Form1中它已隐藏。

在窗体2:

private buttonForm2_click(object sender,EventArgs e) 
{ 
//What Can I DO ? 
//I Don't Want to Create Another Instance From Form1 

} 
+0

可能重复的[访问窗体之间的公共方法](http://*.com/questions/4176682/access-of-public-method-between-forms) – 2011-05-07 17:45:14

+0

在问一个问题之前,这是一个好主意先搜索它。这个确切的问题几乎每天都在这里提出,左边的边栏包含了很多这样的问题。 – 2011-05-07 18:24:45

+0

-1因为相关问题包含几个很好的匹配。 – 2011-05-07 18:25:52

您可以传递一个Form1对象Form2构造:

public partial class Form1 
{ 
    // ... 

    private buttonForm1_click(object sender,EventArgs e) 
    { 
     Form2 frm2 = new Form2(this) 
     frm2.show() 
     this.hide() 
    } 

    // ... 
} 

public partial class Form2 
{ 
    private Form1 _form1; 

    public Form2(Form1 form1) 
    { 
     InitializeComponents(); 

     _form1 = form1; 
    } 

    // ... 

    private buttonForm2_click(object sender,EventArgs e) 
    { 
     _form1.Show(); 
    } 
} 
+1

如果你这样做,确保你也有一个无参数的构造函数,否则Visual Studio将无法在设计视图中打开'Form2'。 – adrianbanks 2011-05-07 17:37:07

+1

我会建议,而不是通过参数传递,而不是通过使用frm2变量来填充Form2中的变量。例如,frm2。CalingForm = this;这样,您仍然可以调用Form2而不需要参数,但是如果需要,您可以选择传递表单参考。 – IAmTimCorey 2011-05-07 17:39:17

+0

@BiggsTRC这取决于'_form1'是什么。在某些情况下,空字段可能会破坏类的完整性,您应该通过它来抛出构造函数。 – oxilumin 2011-05-07 17:41:19

如果你想两种形式访问对方,他们需要了解对方莫名其妙。做到这一点的一种方式是父母/子女关系。但是,这可能不是你想要做的。另一种选择是为每个表单创建引用,以便两者都可以访问它们。

第三种方法是在Form2打开Form2时,将对Form1的引用传递给Form2。在Form2中创建一个Form1变量并在从Form1中打开Form2时填充它。当你希望两个表单能够访问对方时,这将起作用,但不能很好地扩展。

最简单的答案是,在Form2的构造函数传递到Form1的参考。

这样,在Form2中,您可以使用并访问其控件或调用其中的方法。

在Form1:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Form1Form2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var f = new Form2(this); 
      f.Show(); 
     } 
    } 
} 

在窗体2:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Form1Form2 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     Form1 _f1 = null; 
     public Form2(Form1 f) : this() 
     { 
      _f1 = f; 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      _f1.Text = "Nice!"; 
     } 
    } 
} 

如果不创建的窗体的多个副本,我觉得这是最容易使用的方法。让表单本身为它创建句柄:

public partial class Form1 
{ 
    public static Form1 Current; 

    public Form1() 
    { 
     InitializeComponents(); 
     Current = this; 
    } 
} 

public partial class Form2 
{ 
    public static Form2 Current; 

    public Form2() 
    { 
     InitializeComponents(); 
     Current = this; 
    } 

    private buttonForm2_click(object sender,EventArgs e) 
    { 
     Form1.Current.Show(); 
    } 
} 

如果人们关闭表单,它会变得更复杂一点。所以在交割处理做(如果你想保持一个手柄):

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
    Visible = false; 
    WindowState = FormWindowState.Minimized; 
} 

e.Cancel将保持形式从实际被破坏,需要你重新创建它。尽管如果你想要它被销毁,你总是可以通过将Current变量转换为一个Current属性来创建一个新的属性get;