【问题标题】:Handling/capturing a button click event as a priority in WinForms处理/捕获按钮单击事件作为 WinForms 中的优先级
【发布时间】:2021-05-21 06:03:10
【问题描述】:

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

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

当子窗体打开时,焦点在文本框1。

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 事件的情况下使“取消”单击起作用?

提前致谢, 问候。

【问题讨论】:

  • 当您单击Save 按钮而不是Leave 事件时验证输入。
  • 另外,使用ErrorProvider 而不是消息框。
  • 不要使用 Leave,Validating 事件就是为此而设计的。将 Cancel 按钮的 CausesValidation 属性设置为 false。

标签: winforms


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多