【发布时间】:2011-06-09 20:40:16
【问题描述】:
当我按如下方式加载表单时:
MYFORM f = new MYFORM();
f.MdiParent = this;
f.Show();
它的 MyForm_Activated 事件触发。但是当我调用表单的 Activate 方法时:
// 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:
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 方法激活一个子窗体实际上并没有激活它。微软使用“激活”来表示多个不同的事物。这就是让我感到困惑的原因。
@Dyppl:当父窗体调用子窗体的Activate方法时,父窗体具有焦点。
我希望做的是重用 ReportForm 来显示各种报告。如果它已经打开显示客户列表,比如说,然后用户选择了其他报告,我希望子表单显示其他报告。我希望分配一个自定义的公共 ReportForm.CurrentReport 属性,然后简单地(重新)激活子表单,并让它的激活事件这样做:
ReportForm_Activate()
{
this.reportViewer1.Report = this.CurrentReport;
this.reportViewer1.RefreshReport();
}
【问题讨论】:
-
在执行
f.Activate()之前,表单是否处于非活动状态?如果它已经处于活动状态,则不会再次“激活”。 -
在您尝试激活表单时是否可见?
-
没有复制,这很好用。发布的代码不可能工作,“f”是一个局部变量。
-
@Hans Passant:我将编辑问题以使其更清晰。
-
@Dyppl:当父窗体调用子窗体的Activate方法时,父窗体具有焦点。