一、两个窗体之间通过事件传值:Form2是在Form1中new出来的。当Form2按钮按下时,可以将按钮的Text信息传递给Form1显示。
解决:
①事件的定义:在Form2中。由于实际出发事件是在Form2中,所以是在Form2中定义。
// 定义hander,就可以自定义事件的传值个数和类型
public delegate void TriggerEventHander( string lblInfo );
// 定义事件
public event TriggerEventHander TriggerEvent;
②事件的触发:在Form2的按钮Click事件中对TriggerEvent事件进行触发。
void btnTriggerEvent_Click( object sender, EventArgs e )
{
TriggerEvent( ( (Button)sender ).Text );
}
③事件的挂载:在Form1中New出Form2的对象后进行挂载事件
m_frm2 = new Form2();
m_frm2.TriggerEvent += ShowInformation;
同时写出挂载的方法
void ShowInformation( string lblInfor )
{
lblShowInfo.Text = lblInfor;
}
二、另一种方式———多一个Event类(静态)
1、在Form2中click事件发生时:不是触发事件,是调用“Event”类中的一个方法。在方法中触发事件。
上述事件
是在“Event”类中定义
的(实际上在哪定义都可以,只要挂载的“人”能认得这个“人”,放在“Event”类中定义主要为了将关系分的更开);事件触发执行的方法
是在“Event”类中;事件的挂载
是在Form1中(谁接收信息,谁挂载
)
好处:①因为事件不(应该)属于任何一个Form,单独拿到Form类中,就可以将各个之间的关系分的更清楚。
②可以将Form1和Form2中的Click事件都放到Event.cs中来,这样就分的更清楚了。
③更进一步的,Form2甚至可以不在Form1中new出来,在Programe.cs中new,这样的话Form1和Form1就完全分开了。
如在Programe.cs中:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
//此处new出 Form2以后就用不到这个“m_frm2 ”名字了,
//以后出来只是在类中挂载了事件,执行了方法后自己出来的。
Form2 m_frm2 = new Form2();
Application.Run( new Form1() );
}
Form2中的挂载以及对应的方法
public Form2()
{
InitializeComponent();
EventCenter.ShowForm2Event += ShowForm2Event;
}
void ShowForm2Event()
{
Show();
}