2016-02-21 6 views
0

Я нашел много информации об этой теме и украл большую часть моего текущего кода из других тем на этом форуме, но не похоже, могут правильно собрать все это вместе. Я создал основную форму «Form1», которая является контейнером mdi. Я могу создать дочернюю форму «formStripChart» из пункта меню Form1. Я хотел бы запустить собственное событие, которое запускается каждый раз, когда обработчик timer_tick запускается в Form1 и захватывает мое событие в обработчике событий в formStripChart для обновления элемента управления диаграммой. Я вижу, что Form1 вызывает метод UpdateStatus, но OnUpdateStatus всегда имеет значение null, поэтому обработчик события UpdateStatus в formStripChart никогда не вызывается. Похоже, я не делаю ничего, что нужно сделать в formStripChart, чтобы заставить Form1 понять, что кто-то слушает событие, но я не смог понять, что.Как создать событие в родительской форме mdi и уловить его в дочерней форме

Вот соответствующий код в форме 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

Это может быть проще передать Form1 в конструкторе формы ребенка, как это:

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

Таким образом, ваша форма ребенок знает, что экземпляр основного вида использования.

+0

Ну, это не только легче, но и исправлено мое решение. Большое спасибо. –

+0

Добро пожаловать! –

Смежные вопросы