Windows窗体:激活方法和激活事件

时间:2011-06-09 20:40:16

标签: .net winforms

当我按如下方式加载表单时:

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

其MyForm_Activated事件触发。但是当我调用表单的激活方法时:

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

MyForm_Activated事件未触发。这种行为是设计还是我错过了什么?我希望激活表单时触发表单的Activated事件。那可能吗?感谢

编辑清晰度:

我有一个MDI父表单,用于启动子表单。子窗体显示一个报告,并通过其构造函数告知要显示哪个报告:

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

父MDI表单已完成此操作以启动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();
             }

当子ReportForm通过其构造函数实例化时,其Activated事件将触发。但是当简单激活子表单时,子表单的Activate方法不会触发。换句话说,通过其Activate方法激活子表单实际上并不激活它。微软正在使用“激活”来表示多种不同的东西。这就是让我感到困惑的原因。

@Dyppl:当父窗体调用子窗体的Activate方法时,父窗体具有焦点。

我希望做的是重新使用ReportForm来显示各种报告。如果它已经打开,显示客户列表,然后用户选择其他报告,我希望子表单显示其他报告。我希望分配一个自定义的公共ReportForm.CurrentReport属性,然后简单地(重新)激活子窗体,并让它的activate事件执行此操作:

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

2 个答案:

答案 0 :(得分:1)

当用户(或程序)将窗口置于前面时(可能是在其他程序处于活动状态时单击它),会引发激活的事件。

如果这是活动应用程序,Form.Activate将它带到前面,如果这不是活动应用程序,它会闪烁窗口标题。 MSDN Form.Activate

答案 1 :(得分: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()方法后声明事件处理程序,则不会执行事件处理程序。