![](/img/trans.png)
[英]how to prevent a single MDI child form stealing focus from every other mdi child form
[英]How to prevent MDI main form closing from MDI Child
我有一個MDI主要表格。 我在上面托管一個表單,希望它在關閉前顯示一個消息框(詢問用戶是否保存更改)。
到目前為止,到目前為止還不錯,但是我發現關閉MDI主窗體不會引發MDI子FormClosing事件。 我想我只會在MDI主程序的FormClosing事件(確實會引發)中調用MdiChild .Close()。 這可以正常工作,但是確實會導致問題...
在顯示的消息框中,我為用戶提供了保存更改,而不是保存更改並取消關閉的功能。 通常,這可以正常工作,但是我似乎找不到消除MDI main的FormClosing事件的方法。 是否有一種優雅的方法?
編輯 :我通過拋出一個異常(當用戶決定取消關閉過程時)解決了此問題,該異常在MDI main的FormClosing事件中捕獲。 這樣,我知道何時必須取消MDI主站的FormClosing事件並且此接縫才能正常工作……但是,我簡直不敢相信此“ hax”是執行此操作的唯一方法。 當然有更好的方法嗎?
我認為您在用戶投票取消關閉子窗體時取消了子窗體上的關閉?
在這種情況下,我將關閉此主窗體
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
foreach (Form frm in this.MdiChildren)
{
frm.Close();
}
}
e.Cancel = (this.MdiChildren.Length > 0);
}
我建議不要在子窗體上調用Close
,而可以在子窗體中創建類似ReadyToClose
的方法,然后主窗體循環遍歷並為每個子窗體調用該方法,並向用戶和進行保存(如果需要),最后,如果可以繼續,它將返回true。
並且如果所有子級都進行“投票”關閉,則將其全部關閉,否則不進行任何關閉。
關閉MDI主窗體時,將首先調用所有子級Close事件,因此,在foreach循環上調用frm.Close()時,將再次調用該子級的Close事件(我不知道為什么應該已經關閉它們) 。
ho1的建議對我來說效果很好。 這是我修改的foreach循環(ClosableMDIChildForm是包含IsOkToClose()方法的接口):
foreach (ClosableMDIChildForm cmdif in this.MdiChildren)
{
if (!cmdif.IsOkToClose())
{
e.Cancel = true;
((Form)mdifc).Focus();
break;
}
}
顯然,this.MdiChildren表單必須實現ClosableMDIChildForm接口。 IsOkToClose()的實現決定了是否可以關閉窗口的邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.