2016-02-21 59 views
0

我已經在這個主題上找到了相當多的信息,並且從本論壇上的其他主題中竊取了大部分當前代碼,但是沒有似乎能夠正確地把它們放在一起。我創建了一個主窗體「Form1」,它是一個mdi容器。我可以從Form1上的菜單項創建一個子窗體「formStripChart」。我想開發自己的事件,每次在Form1中觸發timer_tick處理程序時觸發我自己的事件,並在formStripChart的事件處理程序中捕獲我的事件以更新圖表控件。我可以看到Form1正在調用「UpdateStatus」方法,但OnUpdateStatus始終爲空,因此formStripChart中的「UpdateStatus」事件處理程序永遠不會被調用。好像我沒有在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

不客氣! –

相關問題