标签:
一、编码思路
在父窗体使用Lambda表达式自定义事件赋给子窗体内定义的事件,通过在子窗体内调用事件实现传参
二、传递的参数
创建文件SomeUtility.cs,在类SomeUtility中声明结构ReturnStruct
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventTest
{
public class SomeUtility
{
public struct ReturnStruct
{
public string sData1;
public string sData2;
public string sData3;
public ReturnStruct(string s1, string s2, string s3)
{
sData1 = s1;
sData2 = s2;
sData3 = s3;
}
}
}
}
三、子窗体相关

窗体FormTip,里面有三个TextBox,单击确定会将三个TextBox的值传递到父窗体中
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 EventTest
{
public partial class FormTip : Form
{
public class TEventArgs<T> : EventArgs
{
public T Args
{
get;
private set;
}
public TEventArgs(T args)
{
this.Args = args;
}
}
[Browsable(false)]
internal event EventHandler<TEventArgs<SomeUtility.ReturnStruct>> EventTest;
SomeUtility.ReturnStruct rs;
public SomeUtility.ReturnStruct GetReturnStruct()
{
return rs;
}
//构造函数1:无参数
public FormTip()
{
InitializeComponent();
}
//构造函数2:有一个ReturnStruct类型参数
public FormTip(SomeUtility.ReturnStruct r)
{
InitializeComponent();
this.rs.sData1 = r.sData1;
this.rs.sData2 = r.sData2;
this.rs.sData3 = r.sData3;
}
private void FormTip_Load(object sender, EventArgs e)
{
this.txtData1.Text = rs.sData1;
this.txtData2.Text = rs.sData2;
this.txtData3.Text = rs.sData3;
}
//单击“确定”按钮:调用事件EventTest
private void btnOK_Click(object sender, EventArgs e)
{
//调用事件EventTest
if (this.EventTest != null)
{
SomeUtility.ReturnStruct rs = new SomeUtility.ReturnStruct(
this.txtData1.Text, this.txtData2.Text, this.txtData3.Text);
this.EventTest(this, new TEventArgs<SomeUtility.ReturnStruct>(rs));
}
//退出窗口
this.Close();
}
//单击“取消”按钮:直接退出
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
四、父窗体相关

窗体FormMain,单击按钮btnTest打开子窗体,并在单击子窗体的“确定”按钮后根据子窗体内设置的值更新txtResult中的文本内容
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 EventTest
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void FormMain_Load(object sender, EventArgs e)
{
this.txtResult.Text = "1:- 2:- 3:-";
}
private void btnTest_Click(object sender, EventArgs e)
{
SomeUtility.ReturnStruct rsTest =
new SomeUtility.ReturnStruct("Data1", "Data2", "Data3");
FormTip frmTip = new FormTip(rsTest);
frmTip.EventTest += (obj, args) =>
{
SomeUtility.ReturnStruct rsTemp = frmTip.GetReturnStruct();
rsTest.sData1 = args.Args.sData1;
rsTest.sData2 = args.Args.sData2;
rsTest.sData3 = args.Args.sData3;
this.txtResult.Text = string.Format("1:{0} 2:{1} 3:{2}",
rsTest.sData1, rsTest.sData2, rsTest.sData3);
MessageBox.Show("赋值成功");
};
frmTip.ShowDialog();
}
}
}
五、运行示例
1)打开父窗体FormMain

2)打开子窗体FormTip,输入三个值

3)将三个值传回父窗体FormMain

END
标签:
原文地址:http://my.oschina.net/Tsybius2014/blog/295124