跳跃形式
之间我们可以访问窗体2从Form1中通过这种方式:跳跃形式
在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
}
您可以传递一个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();
}
}
如果你这样做,确保你也有一个无参数的构造函数,否则Visual Studio将无法在设计视图中打开'Form2'。 – adrianbanks 2011-05-07 17:37:07
我会建议,而不是通过参数传递,而不是通过使用frm2变量来填充Form2中的变量。例如,frm2。CalingForm = this;这样,您仍然可以调用Form2而不需要参数,但是如果需要,您可以选择传递表单参考。 – IAmTimCorey 2011-05-07 17:39:17
@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;
。
可能重复的[访问窗体之间的公共方法](http://*.com/questions/4176682/access-of-public-method-between-forms) – 2011-05-07 17:45:14
在问一个问题之前,这是一个好主意先搜索它。这个确切的问题几乎每天都在这里提出,左边的边栏包含了很多这样的问题。 – 2011-05-07 18:24:45
-1因为相关问题包含几个很好的匹配。 – 2011-05-07 18:25:52