當我打開一個表格如下: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