2011-06-09 300 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()方法后声明事件处理程序,则不会执行事件处理程序。