如何在 mdi 父窗体中创建事件并在子窗体中捕获它
本文关键字:窗体 事件 创建 mdi | 更新日期: 2023-09-27 18:35:41
我找到了关于这个主题的大量信息,并从这个论坛的其他线程中窃取了我当前的大部分代码,但似乎无法正确地将它们放在一起。 我创建了一个主窗体"Form1",它是一个 mdi 容器。 我可以从 Form1 上的菜单项创建一个子窗体"formStripChart"。 我想触发我自己的事件,每次timer_tick处理程序在 Form1 中触发时都会触发该事件,并在 formStripChart 中的事件处理程序中捕获我的事件以更新图表控件。 我可以看到 Form1 正在调用"UpdateStatus"方法,但 OnUpdateStatus 始终为空,因此 formStripChart 中的"UpdateStatus"事件处理程序永远不会被调用。 似乎我没有做任何需要在formStripChart中做的事情,以使Form1意识到有人正在收听该事件,但我无法弄清楚是什么。
这是表单 1 中的相关代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e);
public event StatusUpdateHandler OnUpdateStatus;
private static double depthValue = 0.0;
private static Random randomValue = new Random();
private void timerData_Tick(object sender, EventArgs e)
{
depthValue = depthValue + randomValue.NextDouble() - 0.5;
iusblEventArgs.xValue = 0.0;
iusblEventArgs.yValue = 0.0;
iusblEventArgs.zValue = depthValue;
iusblEventArgs.timeStamp = DateTime.Now;
ProgressEventArgs args = new ProgressEventArgs("test status");
UpdateStatus("sent from timerData_tick");
}
private void UpdateStatus(string status)
{
// Make sure someone is listening to event
if (OnUpdateStatus == null) return;
ProgressEventArgs args = new ProgressEventArgs(status);
OnUpdateStatus(this, args);
}
public class ProgressEventArgs : EventArgs
{
public string Status { get; private set; }
public ProgressEventArgs(string status)
{
Status = status;
}
}
private void btnGo_Click(object sender, EventArgs e)
{
timerData.Enabled = true;
}
这是formStripChart中的相关代码
public partial class FormStripChart : Form
{
private Form1 form1;
public FormStripChart()
{
InitializeComponent();
form1 = new Form1();
form1.OnUpdateStatus += new Form1.StatusUpdateHandler(UpdateStatus);
}
private void UpdateStatus(object sender, Form1.ProgressEventArgs e)
{
Console.Write("Update the chart here");
}
}
感谢您的任何帮助。
像这样将 form1 传递给子窗体的构造函数可能更容易:
Public void FormStripChart(Form1 f)
{
form1 = f;
form1.OnUpdateStatus += new Form1.StatusUpdateHandler(UpdateStatus);
}
这样,子窗体就知道要使用主窗体的哪个实例。