当我按如下方式加载表单时:
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();
}
答案 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()
方法后声明事件处理程序,则不会执行事件处理程序。