VB.NET предотвращает закрытие родительской формы MDI от закрытия дочернего MDI перед проверкой

Я пытаюсь дать пользователю возможность отменить FormClosing родительского элемента MDI, задав запрос «Вы уверены?» msgbox с e.cancel, однако, когда FormClosing вызывается родительским элементом MDI, сначала закрываются все дочерние элементы MDI, прежде чем появится msgbox.

Мне было интересно, есть ли более простой способ предотвратить закрытие дочерних элементов MDI вместо того, чтобы e.cancel каждой дочерней формы FormClosing, пока я не получу положительный ответ на закрытие, а затем подтолкну все события закрытия к дочерним элементам, потому что это кажется слишком большим хлопот, если у вас много детей MDI.

РЕДАКТИРОВАТЬ: Я думаю, единственное решение, которое я могу найти, - это добавить If e.CloseReason = CloseReason.MdiFormClosing Then e.Cancel = True в событие FormClosing и вместо этого использовать ApplicationExit.


person Theveloper    schedule 09.10.2011    source источник
comment
Такой интерфейс сводит меня с ума. Да, черт возьми, я уверен.   -  person Hans Passant    schedule 10.10.2011
comment
Что, если вы поймете, что не были так уверены после того, как он закроется, ха-ха   -  person Theveloper    schedule 14.10.2011
comment
Тогда я говорю, стреляй и заводи обратно, моя ошибка. Это один выстрел на каждую сотню черт.   -  person Hans Passant    schedule 14.10.2011
comment
но вы не согласны с тем, что небольшой дискомфорт может спасти от боли?   -  person Theveloper    schedule 14.10.2011
comment
Почему, черт возьми, закрытие программы вызывает «много боли»? Я все время закрываю программы, никогда не помешает.   -  person Hans Passant    schedule 14.10.2011
comment
Образно Ганс, образно. Что, если вы написали эссе на 20 страниц и потеряли его: О painnn   -  person Theveloper    schedule 14.10.2011
comment
Это совершенно другое приглашение, требующее диалогового окна «да / нет / отменить». Вы избегаете этого, всегда сохраняя «незавершенную работу», которую вы перезагружаете при запуске программы.   -  person Hans Passant    schedule 14.10.2011
comment
Я имею в виду, что именно по этой причине я использую метод «Вы уверены?» У меня нет возможности сохранить сеанс ...   -  person Theveloper    schedule 14.10.2011


Ответы (3)


If e.CloseReason = CloseReason.MdiFormClosing Then
   e.Cancel = True
End If

Должен выполнить задание, после которого вы можете использовать Application.Exit всякий раз, когда хотите закрыть приложение.

person Theveloper    schedule 19.10.2011

Начать форму от родителя

    frmMdiChild1.MdiParent = Me
    frmMdiChild1.Show()

Добавить подписку для закрытия формы

Private Sub frmMdiChild1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    If e.CloseReason = CloseReason.UserClosing Then
        e.Cancel = True
    End If
End Sub

@ Разработчик: Я пробовал .MdiFormClosing, но это не сработало. Чтобы узнать, что использовать, я сделал MsgBox (e.CloseReason). Кроме того, только e.Cancel = True также предотвратит закрытие родителя (смеется).

(vb.net 2010)

person Soliman    schedule 26.10.2012

Открытый класс clsGlobalVariables

Public Shared mdi_main As mdiMain

Конец класса

Импортирует System.Windows.Forms

Открытый класс mdiMain

Public forced_close As Boolean = False

Private Sub mdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    e.Cancel = True
    If MsgBox("Are you sure you want to exit?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
        ' Close all child forms of the parent.
        For Each ChildForm As Form In Me.MdiChildren
            ChildForm.Close()
        Next
        e.Cancel = False
    End If
End Sub

Конец класса

Открытый класс frmMember

Private Sub frmMember_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    Select Case e.CloseReason
        Case CloseReason.UserClosing
            e.Cancel = True
            If Not clsGlobalVariables.mdi_main.forced_close Then
                If MsgBox("Are you sure you want to close?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
                    e.Cancel = False
                End If
            End If
        Case Else
            clsGlobalVariables.mdi_main.forced_close = True
            e.Cancel = True
    End Select
End Sub

Конец класса

person อมร อุ่นจิตต์วรรธนะ    schedule 15.03.2017