2011-06-09 94 views
1

當我打開一個表格如下:Windows窗體:激活方法和激活事件

 MYFORM f = new MYFORM(); 
    f.MdiParent = this; 
    f.Show(); 

其MyForm_Activated事件觸發。但是,當我調用形式的激活方法:

 // if form is already loaded just activate it: 
     f.Activate(); 

MyForm_Activated不會觸發事件。這是行爲的設計還是我錯過了什麼?我希望表單的激活事件在表單激活時觸發。那可能嗎?由於

編輯度:

我有一個啓動子形式的MDI父窗體。子窗體顯示一個報告,它被告知該報告通過其構造函數來顯示:

 public ReportForm(MyReport RPT) 
     { 
      InitializeComponent(); 
      this.reportViewer1.Report = RPT; 
      this.reportViewer1.RefreshReport(); 
      } 

父MDI形式已經做到了這一點,推出了ReportForm:當孩子ReportForm是

  ActivateOrLoad action = ActivateOrLoad.Load; // default; a custom enum 

      foreach (Form ff in this.MdiChildren) 
      { 
      if (ff.Name == "ReportForm") 
      { 
       action = ActivateOrLoad.Activate; 
       ff.Activate(); 
      } 
      } 

      //load the form only if it is not already loaded 
      if (action == ActivateOrLoad.Load) 
      { 
       ReportForm f = new ReportForm(new MyReports.CustomerList()); 
       f.MdiParent = this; 
       f.Show(); 
      } 

通過其構造函數實例化,其激活的事件觸發。但是當子窗體被簡單地激活時,那麼子窗體的激活方法不會觸發。換句話說,通過Activate方法激活子窗體並不會實際激活它。微軟正在使用「激活」來表示多種不同的事物。這就是我所迷惑的。

@Dyppl:父窗體調用子窗體的Activate方法時,父窗體具有焦點。

我希望做的是重用ReportForm來顯示各種報告。如果它已經打開顯示客戶列表,說,然後用戶選擇一些其他報告,我希望子窗體顯示其他報告。我希望能指定自定義公共ReportForm.CurrentReport屬性,然後簡單地(重新)啓動子的形式,有其激活事件做到這一點:

 ReportForm_Activate() 
     { 
      this.reportViewer1.Report = this.CurrentReport; 
      this.reportViewer1.RefreshReport(); 
      } 
+0

在做'f.Activate()'之前表單是非活動的?如果它已被激活,則不會再次「激活」。 – 2011-06-09 20:45:24

+0

當您試圖激活它時,窗體是否可見? – Dyppl 2011-06-09 20:46:36

+0

沒有repro,這工作正常。發佈的代碼不可能工作,「f」是一個局部變量。 – 2011-06-09 22:03:00

回答

1

激活的事件會在用戶(或程序)將窗口置於前面(也許在不同的程序處於活動狀態時單擊該窗口)。

如果這是活動的應用程序,Form.Activate會將其帶到最前面,或者如果它不是活動的應用程序,它將閃爍窗口標題。 MSDN Form.Activate

+0

我讀過這篇文檔,但沒有聲明Activated事件是否會在表單的Activate方法被調用時觸發。 – Tim 2011-06-10 17:07:57

+0

激活的事件與[WM_ACTIVATE](http://msdn.microsoft.com/en-us/library/ms646274(v = vs.85).aspx)窗口消息的關係更接近Activate方法。 – 2011-06-10 21:26:01

+0

要解決您的問題,請考慮將代碼從Activate移至名爲Reload()的新方法。然後Activate可以調用Reload()並且MDIParent可以調用Reload()。 – 2011-06-10 21:33:47

0

如果定義了OnFormActivated事件處理程序調用Show()方法之前,加載的形式在事件處理程序應激發。考慮下面的例子。

在MyForm的類中,聲明如下委託:

public delegate void MyFormActivated(object sender); 

早在實例化和加載MyForm的對象的類:

MyForm myForm = new MyForm(); 

myForm.OnFormActivated += new myFormActivated(myOnFormActivatedEventHandlerMethod); 

myForm.MdiParent = this; // do this if the parent class is a form 
myForm.Show(); 

事件處理程序將需要由可訪問調用它們的類,例如實例化和加載MyForm對象的類。

請注意,如果您在調用Show()方法後聲明事件處理程序,則不會執行事件處理程序。