簡體   English   中英

如何防止MDI主窗體從MDI子窗體關閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM