任务:在窗体1点击按钮显示窗体2,在窗体2点击按钮将该窗体TextBox的值传递给窗体1的Label
直接看代码(窗体1的代码)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FormSendValueToForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//将Form2传递过来的值赋值给LabelOne
public void ShowText(string str)
{
labelOne.Text = str;
}
private void buttonOne_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2(ShowText);
form2.ShowDialog();
}
}
}
窗体2的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FormSendValueToForm
{
//与窗体1的ShowText方法签名相同的委托类型
public delegate void DelSendValue(string str);
public partial class Form2 : Form
{
//委托类型字段,存储Form1传送过来的函数
private DelSendValue delMethod;
public Form2(DelSendValue del)
{
this.delMethod = del;
InitializeComponent();
}
//通过委托传值给窗体1,实际上运行的是窗体1的ShowText方法
private void buttonTwo_Click(object sender, EventArgs e)
{
this.delMethod(textBoxTwo.Text);
}
}
}
窗体1点击按钮显示窗体2,在窗体1创建一个ShowText方法(返回值为Void,参数为String)用于给Label赋值。
窗体2声明一个委托类型,以及该委托类型的字段,用于存储窗体1传递过来的函数。
点击窗体2的按钮将TextBox的值传递给窗体1的Label,实际上运行的是窗体1的ShowText方法。
简言之:
窗体1说:我有妹子(方法),你有酒(值)。但是我没有办法直接用你窗体2的酒,你也没有办法用我的妹子(方法),既然这样的话,你窗体2先找个咱俩都信得过的中间人(声明一个委托),我的妹子和你中间人联系(方法和你委托签名一致),咱们两个合作一下。可是你窗体2不要随便出来,我告诉你啥时候可以露面了你再出来(窗体2要显示还得通过我窗体1的按钮点击才可以)。如果你窗体2觉得我窗体1靠谱的话,你出来的时候我就把我的妹子带上亲自交到你手中(我窗体1把自己的方法通过窗体2的构造函数给你传过去),妹子平常都是我自己享用的(这个函数平常是我窗体1自己用来给自己的Label赋值的),你窗体2可得好生照顾啊(窗体2暂时在构造函数里面先用你的委托字段把我的方法保存好)。
窗体2说:你好,窗体1,你的妹子已经来到我这儿了(窗体1发过来的方法我已经通过我的构造函数保存好了)。今天玩的很高兴!为了表达我的诚意,妹子回去的时候,我窗体2已经发信息告诉让咱俩的中间人给妹子怀里塞了一瓶我珍藏多年的好酒,请接收!(窗体2在按钮点击事件里面调用了委托,委托里面有你窗体1的方法,所以我窗体2把我的TextBox里面的值通过该委托给你传递过去了!实在不好意思哈,为了给你带酒,也只好委屈妹子了(为了给你窗体1传值,我间接的调用了你窗体1的ShowText方法)!
窗体1:OK,我已经收到 了你窗体2的美酒,感谢!(窗体1收到窗体2传过来的值了)!合作愉快!