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





Это так просто. :)
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()
Аргументы события класса 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();
Спасибо, Ctznkane, он попробовал именно это, и проблема в том, что команда if также выполняется, когда я отправляю me.close () из кода. Кажется, есть настоящие Close.Reasons, чтобы различать me.close () и x-button !?
Предполагая, что вы используете событие
FormClosing,senderвсегда будет самой формой, поскольку именно он отправил / инициировал событие. Аргументы события сообщают вам причину.