如何在 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");
    }
}

感谢您的任何帮助。

如何在 mdi 父窗体中创建事件并在子窗体中捕获它

像这样将 form1 传递给子窗体的构造函数可能更容易:

Public void FormStripChart(Form1 f)
{
    form1 = f;
    form1.OnUpdateStatus += new Form1.StatusUpdateHandler(UpdateStatus);
}

这样,子窗体就知道要使用主窗体的哪个实例。