2014-07-28 3 views
0

В моем mdiMain у меня есть этот код.Как вы обходите событие FormClosing в vb.net?

Private Sub mdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    e.Cancel = IIf(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True) 
End Sub 

Моей причиной для этого является уловить все триггеры закрытия формы. Либо если пользователь нажимает кнопку выхода из системы, либо они нажимают кнопку x в верхнем правом углу окна или даже если они нажимают Alt-F4. В соответствии с FormClosed того же MDI существует набор инструкций после того, как было подтверждено, что он вышел из системы. Моя проблема в том, что у меня также есть процесс, когда пользователь принудительно выходил из программы. Поскольку пользователь «принудительно» выходит из системы, диалог подтверждения должен быть обойден. Но я не уверен, как обойти событие FormClosing и пропустить непосредственно до FormClosed.

До сих пор я только придумал один способ, чтобы установить булевский триггер. Что-то наподобие

Private Sub mdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    If ForceLogOut = True Then Exit Sub 
    e.Cancel = IIf(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True) 
End Sub 

Но, ради знания, мне все равно хотелось бы услышать от других людей о других путях для этого.

ответ

5

Вы можете проверить FormClosingEventArgs.CloseReason, чтобы узнать, почему форма закрывается, то есть какое событие заставило форму закрыть и установить флаг отмены соответственно.

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    Select Case e.CloseReason 
     Case CloseReason.TaskManagerClosing 
      e.Cancel = False 
     Case CloseReason.MdiFormClosing 
      e.Cancel = If(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True) 
      'etc 
    End Select 
End Sub 

Примечание: Вы должны использовать IfOperator не функцию IIf в VB.NET, как это типобезопасен. Вы также должны включить опцию strict on (которая, кстати, не позволит вам использовать IIf именно по этой причине)

+0

good ........... –

+0

Спасибо за ответ. Я проверю это, как только я вернусь домой. «CloseReason» действительно интересен. Интересно, могу ли я использовать объекты формы, такие как кнопки? Например. 'CloseReason.btnClose' У меня есть эта зависимость от одной строки, например,' IIf' Но почему это небезопасно? – YinYangKim

+0

Нет, вы не можете, близкая причина - перечислить. Вычисление каждого значения происходит здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason(v=vs.110).aspx –

Смежные вопросы