用消息机制实现由form1打开的两个子窗体form2和form3,数据在这两个子窗体之间传递,具体举例说明
时间: 2023-06-17 08:07:31 浏览: 166
假设在 Form1 中有两个按钮 btnOpenForm2 和 btnOpenForm3,分别用于打开 Form2 和 Form3 窗体。在 Form2 和 Form3 窗体中分别有一个文本框 textBox1 和 textBox2,用于接收从另一个窗体传递过来的数据。
首先,在 Form2 和 Form3 窗体中定义一个委托类型和一个事件:
```csharp
public delegate void DataChangedEventHandler(string data);
public event DataChangedEventHandler DataChanged;
```
这样就定义了一个名为 DataChanged 的事件,该事件的参数为 string 类型的数据。
在 Form2 中,当窗体加载时,我们需要将该窗体注册到 Form1 中。具体实现如下:
```csharp
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
// 注册到 Form1
((Form1)this.Owner).DataChanged += new DataChangedEventHandler(Form2_DataChanged);
}
private void Form2_DataChanged(string data)
{
// 从 Form1 接收到数据后更新 textBox1
textBox1.Text = data;
}
}
```
在 Form3 中同样需要注册到 Form1,具体实现与 Form2 相似。在 Form3 中,当数据发生变化时,我们需要触发 DataChanged 事件,将数据传递给 Form2。代码示例如下:
```csharp
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void Form3_Load(object sender, EventArgs e)
{
// 注册到 Form1
((Form1)this.Owner).DataChanged += new DataChangedEventHandler(Form3_DataChanged);
}
private void Form3_DataChanged(string data)
{
// 从 Form1 接收到数据后更新 textBox2
textBox2.Text = data;
}
private void btnChangeData_Click(object sender, EventArgs e)
{
// 修改数据并触发 DataChanged 事件
((Form1)this.Owner).DataChanged?.Invoke("Hello World!");
}
}
```
在 btnChangeData 的 Click 事件中,我们将数据修改为 "Hello World!" 并触发 DataChanged 事件,将数据传递给 Form2。
最后,在 Form1 中,我们需要在 btnOpenForm2 和 btnOpenForm3 的 Click 事件中打开 Form2 和 Form3 窗体,并将当前窗体作为 Owner 传递给它们。具体实现如下:
```csharp
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnOpenForm2_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Owner = this;
form2.Show();
}
private void btnOpenForm3_Click(object sender, EventArgs e)
{
Form3 form3 = new Form3();
form3.Owner = this;
form3.Show();
}
}
```
现在,当我们在 Form3 中点击 btnChangeData 按钮时,数据就会传递给 Form2,并且分别显示在它们的文本框中。
阅读全文