.Net Winforms会告诉您是否按下了退出按钮

.Net Winforms会告诉您是否按下了退出按钮,.net,winforms,validation,controls,.net,Winforms,Validation,Controls,我正在使用一些控件,当任何事情发生时,包括当用户按下退出按钮时,都会捕获验证。是否有办法判断是否按下了退出按钮?如果您指的是窗口右上角的关闭按钮,则需要使用FormClosing事件。假设退出按钮指的是右上角的小“X”按钮;否。也就是说,单击按钮直接触发onClose事件,而不需要任何中间按钮按下或绑定到的事件。一旦你进入了一圈,你可以试着弄清楚你是如何到达那里的,但是没有“中间”步骤。我的建议是,在关闭事件中调用所有验证;如果验证失败,您可以通过onClose事件参数取消关闭,然后从那里开始工

我正在使用一些控件,当任何事情发生时,包括当用户按下退出按钮时,都会捕获验证。是否有办法判断是否按下了退出按钮?

如果您指的是窗口右上角的关闭按钮,则需要使用FormClosing事件。

假设退出按钮指的是右上角的小“X”按钮;否。也就是说,单击按钮直接触发onClose事件,而不需要任何中间按钮按下或绑定到的事件。一旦你进入了一圈,你可以试着弄清楚你是如何到达那里的,但是没有“中间”步骤。我的建议是,在关闭事件中调用所有验证;如果验证失败,您可以通过onClose事件参数取消关闭,然后从那里开始工作。

谢谢大家。找到了一个完全避免这种情况的解决方案

我试图使用基础设施限制列表的下拉功能。但是,该功能阻止触发所有其他事件——包括表单关闭!作为解决办法,我想检查LimitToList功能中按下的退出按钮,然后禁用LimitToList以允许退出。所以我开始检查ActiveControl、yada、yada,但遇到了很多问题(如果打开另一个表单会发生什么情况,等等)


因此,我放弃了LimitToList特性,并使用标准验证方法编写了自己的验证事件。我无法理解为什么有人会写一个预先关闭表单的功能

要添加Ray所说的内容,您可以检查表单的FormClosing事件

具体来说,请查看FormClosingEventArgs的CloseReason属性。如果用户单击表单右上角的“x”,则此属性的值将为UserClosing

但是,如果您有自己的关闭按钮来关闭表单,则此属性将具有相同的值,因此您无法判断用户是如何关闭表单的

我要做的是在我的表单中添加一个名为_closeButtonClicked的bool字段,如果单击了我的Close按钮,则将其设置为true。在我的FormClosing事件中,我检查e.CloseReason==UserClosing和_closeButtonClicked


这对我很有效,但我想知道是否有更好的方法。

这解释了我在尝试捕获ActiveControl对象时看到的情况。谢谢,你说得对。我克服了这个方法,能够在关闭之前给我的一个程序一个“最小化到托盘”。你的意思是提供某种机制来阻止用户,比如“关闭此表单将丢弃任何更新或添加的内容?”