首页 > 解决方案 > 处理/捕获按钮单击事件作为 WinForms 中的优先级

问题描述

这是我在 Windows 窗体应用程序中拥有的子窗口的模型。

这将在父窗口上单击按钮时显示。

在此处输入图像描述

当子窗体打开时,焦点位于 Text box1 中。

Text box1 上的 Leave 事件会在用户跳出它或单击任何按钮时触发。这会触发验证:

if(String.IsNullOrEmpty(textBox1.Text)
{ 
   MessageBox.Show("Please enter a value of Id.");
}
else {
 ... other logic omitted for brevity
}

现在用户也可以点击取消按钮退出表单而不做任何操作。

在这里,第一次尝试时,Leave 事件会触发,因为加载表单时焦点位于 Text box1 中,因此当用户第一次单击“取消”时,表单不会关闭,而是显示带有验证消息的消息框。在第二次单击时,由于焦点不再位于 Text box1 上,因此 Leave 事件不会触发并且窗体会关闭。

我可以将重点放在任何其他控件上来处理这个问题,但为了用户体验,我不得不把重点放在 Textbox1 上,因为它的值决定了 Textbox2 中显示的进一步逻辑(Textbox1 可以留空,在这种情况下什么都没有显示在 Textbox2 中,但这与这个问题无关)。

试过这个,看看我是否可以在 Textbox1 的 Leave 事件中获得 Cancel 按钮:

Button b = sender as Button

当单击取消时,b 为 NULL。

在不触发 Leave 事件的情况下,我该怎么做才能使“取消”单击起作用?

预先感谢,问候。

标签: winforms

解决方案


如果您只想在取消按钮获得焦点时抑制错误消息,只需检查cancelButton.Focused离开事件中的标志,然后在取消按钮获得焦点时阻止消息。

然而,如果不需要模式对话框,通常认为是一种很好的做法。因此,根据您的具体情况,您可以决定将 替换为MessageBoxa ToolTip,这不会完全阻塞 UI 线程。


推荐阅读