需求:
有Form1和Form2两个窗体,在打开Form1的时候打开Form2,然后实现两个窗体之间相互传递值,并打印到各自的Label中。
Form1中代码实现:
public partial class Form1 : Form
{
public delegate void OnDataArrivedHandler(string data);
public event OnDataArrivedHandler DataArrived;
public Form1()
{
InitializeComponent();
//创建Form2的对象,在构造函数中传入Form1的对象
Form2 frm = new Form2(this);
//订阅Form2的数据到达事件,并打印
frm.DataArrived += new Form2.OnDataArrivedHandler((s) => { lbl_Value.Text = s; });
frm.Show();
}
private void btn_Send_Click(object sender, EventArgs e)
{
if (DataArrived != null)
{
DataArrived(txt_Data.Text);
}
}
}
Form2中代码实现:
public partial class Form2 : Form
{
public delegate void OnDataArrivedHandler(string data);
public event OnDataArrivedHandler DataArrived;
//由于Form1窗体在程序初始化的时候就已经创建了,所以在构造Form2的时候将Form1对象传入
public Form2(Form1 frm)
{
InitializeComponent();
//订阅Form1的数据到达事件
frm.DataArrived += new Form1.OnDataArrivedHandler((s) => { lbl_Value.Text = s; });
}
private void btn_Send_Click(object sender, EventArgs e)
{
if (DataArrived != null)
{
DataArrived(txt_Data.Text);
}
}
}
以上使用自定义委托事件的方式实现的,下面介绍一种使用标准事件【EventHandler】来实现的方式:区别在于使用标准事件需要定义一个第三方的类,来传递数据。
Form1代码:
public partial class Form1 : Form
{
public event EventHandler DataArrived;
public Tmp tmp = new Tmp();
public Form1()
{
InitializeComponent();
//创建Form2的对象,在构造函数中传入Form1的对象
Form2 frm = new Form2(this);
//订阅Form2的数据到达事件,并打印
frm.DataArrived += new EventHandler((sender, e) => { lbl_Value.Text = ((Tmp)e).data; });
frm.Show();
}
private void btn_Send_Click_1(object sender, EventArgs e)
{
if (DataArrived != null)
{
tmp.data = txt_Data.Text;
DataArrived(this, tmp);
}
}
}
Form2代码:
public partial class Form2 : Form
{
public event EventHandler DataArrived;
public Tmp tmp = new Tmp();
public Form2(Form1 frm)
{
InitializeComponent();
//订阅Form1的数据到达事件
frm.DataArrived += new EventHandler((sender, e) => { lbl_Value.Text = ((Tmp)e).data; });
}
private void btn_Send_Click_1(object sender, EventArgs e)
{
if (DataArrived != null)
{
tmp.data = txt_Data.Text;
DataArrived(this, tmp);
}
}
}
传递类:
EventHandler这个委托中,相匹配的方法参数列表:
(object sender,EventArgs e)
我们通过继承并重写EventArgs类的方式,为其赋值。
public class Tmp : EventArgs
{
public string data { get; set; }
}
** 以上内容如有错误,非常欢迎批评指正!**