如何在mdi父表单中创建事件并以子表单形式捕获它

时间:2016-02-21 03:59:18

标签: c# forms winforms

我已经找到了关于这个主题的大量信息,并从本论坛的其他主题中窃取了我当前的大部分代码,但似乎无法正确地将它们整合在一起。我创建了一个主窗体“Form1”,它是一个mdi容器。我可以从Form1上的菜单项创建子窗体“formStripChart”。我想触发我自己的事件,每当一个timer_tick处理程序在Form1中触发时触发,并在formStripChart中的事件处理器中捕获我的事件以更新图表控件。我可以看到Form1正在调用“UpdateStatus”方法,但OnUpdateStatus始终为null,因此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");
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

将form1传递给子窗体的构造函数可能更容易,如下所示:

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

这样您的子表单就知道要使用的主表单的实例。