问题描述: 如上图所示,将Form1点击按钮,将Form2显示并将其值传递给Form2中
简单讲,现在有两种方式可以完成二者之间的参数传递,首先第一种:(1) 定义带参的构造函数 (2) 委托、事件
(一) 构造函数传参
抛出的问题中,我们可以明确Form1的值传递给Form2,;我们可以定义Form2一个带参的构造函数,在实现button_click事件时将
Form1的内容传递给Form2,这样即可完成参数传递任务。
public Form2( string str)
{
// 定义带参构造函数
InitializeComponent();
this.textBox1.Text = str;
}
private void button1_Click(object sender, EventArgs e)
{
// 在Form1的click事件响应中实现参数传递
Form2 frm = new Form2(this.textBox1.Text);
frm.Show();
}
(二)委托及事件
其实利用委托及事件完成参数传递降低了窗体间的耦合,其方法如下:
(1) 定义弹出窗体的委托、委托的一个事件,及该事件响应的地方;
(2) 在父窗体中定义响应的方法,并在实例化窗体时注册该方法给弹出窗体。
问题描述中,Form1为传出参数窗体,称之为“弹出窗体”;Form2为接受参数窗体,称之为“父窗体”。
首先定义Form1的一个委托、一个委托的事件,及触发该事件的地方:
public delegate void MyDelegate1(string str); //委托
public event MyDelegate1 MyEvent1;//事件
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
MyEvent1(this.textBox1.Text);
frm2.Show();
} //触发事件地点
其次是定义响应方法,及窗体实例化:
public Form2( )
{
InitializeComponent();
Form1 frm1 = new Form1();
//Form1 frm1 = Form1.Instance();
frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
}
void frm1_MyEvent1(string str)
{
this.textBox1.Text = str;
}
运行期间出现如下错误:
由于Form2的构造函数再次实例化了一个新的Form1。。。。(究其原因,待定,不是很清楚)
但是正确的方向是,定义一个静态实例化窗体,如下代码:
private Form1()
{
InitializeComponent();
}
private static Form1 _instance = null;
public static Form1 Instance()
{
if (_instance == null)
_instance = new Form1();
return _instance;
}
然后将Form2中实例化Form1方式修改为如下:
public Form2( )
{
InitializeComponent();
//Form1 frm1 = new Form1(); --------------> 由于Form1构造函数成为私有,故不能使用。删除
Form1 frm1 = Form1.Instance(); -----------> 使用单一的窗体实例化
frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
}
至此完成了问题描述内容!
若问题描述换成:Form1点击按钮显示Form2,Form2中值修改显示在Form1中,亦可参照上述方式完成参数传递;
若问题描述换成:Form1点击按钮显示Form2,并将Form1中值显示在Form2中;修改Form2中值,点击按钮内容显示在Form1中。则完整的源代码如下所示:
//Form1.cs
namespace Weituo
{
public delegate void MyDelegate1(string str);
public partial class Form1 : Form
{
public event MyDelegate1 MyEvent1;
private Form1()
{
InitializeComponent();
}
private static Form1 _instance = null;
public static Form1 Instance()
{
if (_instance == null)
_instance = new Form1();
return _instance;
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.MyEvent +=new MyDelegate(frm2_MyEvent);
MyEvent1(this.textBox1.Text);
frm2.Show();
}
private void frm2_MyEvent(string str)
{
this.textBox1.Text = str;
}
}
}
Form2.cs 文件
//Form2.cs
namespace Weituo
{
public delegate void MyDelegate(string str);
public partial class Form2 : Form
{
public event MyDelegate MyEvent;
public Form2( )
{
InitializeComponent();
//Form1 frm1 = new Form1();
Form1 frm1 = Form1.Instance();
frm1.MyEvent1 +=new MyDelegate1(frm1_MyEvent1);
}
private void button1_Click(object sender, EventArgs e)
{
MyEvent(this.textBox1.Text);
}
void frm1_MyEvent1(string str)
{
this.textBox1.Text = str;
}
}
}