当我打开一个表格如下: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();
}
在做'f.Activate()'之前表单是非活动的?如果它已被激活,则不会再次“激活”。 – 2011-06-09 20:45:24
当您试图激活它时,窗体是否可见? – Dyppl 2011-06-09 20:46:36
没有repro,这工作正常。发布的代码不可能工作,“f”是一个局部变量。 – 2011-06-09 22:03:00