1.通过调用新建页面对象的方法传值
一共有三个页面(主页面,A页面,B页面)
主页面代码
public ObeserverFormA ChildFormA { get; set; }
public ObeserverFormB ChildFormB { get; set; }
public MainForm()
{
InitializeComponent();
}
private void ParentFrm_Load(object sender, EventArgs e)
{
ObeserverFormA childFormA = new ObeserverFormA();
ChildFormA = childFormA;
childFormA.Show();
ObeserverFormB childFormB = new ObeserverFormB();
ChildFormB = childFormB;
childFormB.Show();
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
ChildFormA.SetText(this.txtMsg.Text);
ChildFormB.SetText(this.txtMsg.Text);
}
A页面代码
public void SetText(string txt)
{
this.txtMsg.Text = txt;
}
public ObeserverFormA()
{
InitializeComponent();
}
B页面代码
public ObeserverFormB()
{
InitializeComponent();
}
public void SetText(string txt)
{
this.txtMsg.Text = txt;
}
2.通过委托方式传值
主页面代码
public Action<string> SendMsg { get; set; }
public MainForm()
{
InitializeComponent();
}
private void ParentFrm_Load(object sender, EventArgs e)
{
ObeserverFormA childFormA = new ObeserverFormA();
SendMsg += childFormA.SetText;//委托赋值
childFormA.Show();
ObeserverFormB childFormB = new ObeserverFormB();
SendMsg += childFormB.SetText;
childFormB.Show();
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
if (SendMsg!=null)
{
SendMsg(this.txtMsg.Text);//执行所有注册的委托
}
}
A页面和B页面同上
3.事件方式
主页面代码
public event EventHandler SendMsgEvent; //使用默认的事件处理委托
public MainForm()
{
InitializeComponent();
}
private void ParentFrm_Load(object sender, EventArgs e)
{
//子窗体弹出来之前,注册事件,关注主窗体消息的变化,当有多个窗体需要接收信息,只需要在此修改即可
ObeserverFormA childFormA = new ObeserverFormA();
SendMsgEvent += childFormA.MainFormTxtChaned;//为子窗体注册事件,在子窗体中事件处理代码中设置文本
childFormA.Show();
ObeserverFormB childFormB = new ObeserverFormB();
SendMsgEvent += childFormB.MainFormTxtChaned;
childFormB.Show();
}
SendMsgEvent(this,new MyEventArg(){Text=this.txtMsg.Text});
新增一个MyeventArg类的代码
public class MyEventArg :EventArgs
{
//传递主窗体的数据信息
public string Text { get; set; }
}
A页面代码
public ObeserverFormA()
{
InitializeComponent();
}
public void SetText(string txt)
{
this.txtMsg.Text = txt;
}
internal void MainFormTxtChaned(object sender, EventArgs e)
{
//取到主窗体的传来的文本
MyEventArg arg = e as MyEventArg;
this.SetText(arg.Text);
}
B页面代码
public ObeserverFormB()
{
InitializeComponent();
}
public void SetText(string txt)
{
this.txtMsg.Text = txt;
}
internal void MainFormTxtChaned(object sender, EventArgs e)
{
//取到主窗体的传来的文本
MyEventArg arg = e as MyEventArg;
this.SetText(arg.Text);
}
4.总结
第一种方式可扩展性差,耦合性较高;一般使用第二种事件委托方式。