我已经找到了关于这个主题的大量信息,并从本论坛的其他主题中窃取了我当前的大部分代码,但似乎无法正确地将它们整合在一起。我创建了一个主窗体“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");
}
}
感谢您的帮助。
答案 0 :(得分:0)
将form1传递给子窗体的构造函数可能更容易,如下所示:
Public void FormStripChart(Form1 f)
{
form1 = f;
form1.OnUpdateStatus += new Form1.StatusUpdateHandler(UpdateStatus);
}
这样您的子表单就知道要使用的主表单的实例。