vb.net: различайте me.close() и x-button

как можно отличить событие, когда пользователь явно нажал кнопку x (или нажал ALT F4), чтобы закрыть форму, и все другие методы программного закрытия формы (me.close() и т. д.). Я уже понял, что это можно сделать с помощью объектов-отправителей, но я действительно этого не понимаю. Может ли кто-нибудь объяснить это для меня на примере? Всем большое спасибо заранее.


person Luke P    schedule 08.04.2018    source источник
comment
Предполагая, что вы используете событие FormClosing, sender всегда будет самой формой, поскольку именно она отправила/инициировала событие. Аргументы события сообщают вам причину.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 08.04.2018


Ответы (2)


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

https://msdn.microsoft.com/en-us/library/system.windows.forms.closereason(v=vs.110).aspx

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.Closing

    If Not appClosing AndAlso e.CloseReason = System.Windows.Forms.CloseReason.UserClosing Then

    ' DO WHATEVER CODE YOU WANT IN HERE
    ' LIKE SETTING E.CANCEL TO TRUE

    End If

End Sub

' You can also set a close appClosing local variable at the class level as a boolean, whenever you call closing in code, assign the variable.
appClosing = True
Me.Close();
person Ctznkane525    schedule 08.04.2018
comment
Спасибо Ctznkane, он попробовал именно это, и проблема в том, что команда if выполняется, когда я также отправляю me.close() из кода. Кажется, есть настоящие Close.Resons, чтобы различать me.close() и кнопку x!? - person Luke P; 09.04.2018

Это так просто. :)

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs)
e.Cancel = True
End Sub

Это предотвратит закрытие формы с помощью кнопки X, а также :). Проблема в том, что если вы сделаете это, вы не сможете закрыть форму с помощью Me.Close. Чтобы исправить это, просто удалите EventHandler :)

  RemoveHandler Me.Closing, AddressOf Form1_FormClosing
  'Now close the form
  Me.Close()
person Christopher H.    schedule 08.04.2018