在WinForms中作为优先级处理/捕获按钮单击事件

在WinForms中作为优先级处理/捕获按钮单击事件,winforms,Winforms,这是我在Windows窗体应用程序中拥有的子窗口的模型 当在父窗口上单击按钮时,将显示此信息 打开子窗体时,焦点位于文本框1中 当用户从文本框1中取出标签或单击任何按钮时,文本框1上的“离开”事件将触发。 这将触发验证: if(String.IsNullOrEmpty(textBox1.Text) { MessageBox.Show("Please enter a value of Id."); } else { ... other logic omitted f

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

当在父窗口上单击按钮时,将显示此信息

打开子窗体时,焦点位于文本框1中

当用户从文本框1中取出标签或单击任何按钮时,文本框1上的“离开”事件将触发。 这将触发验证:

if(String.IsNullOrEmpty(textBox1.Text)
{ 
   MessageBox.Show("Please enter a value of Id.");
}
else {
 ... other logic omitted for brevity
}
现在,用户还可以单击“取消”按钮退出表单,而无需执行任何操作

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

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

尝试此操作以查看是否可以在Textbox1的Leave事件中获得Cancel按钮:

Button b = sender as Button
单击“取消”时,b为空

在不触发休假事件的情况下,如何使取消单击生效

提前感谢,,
关于。

如果您只想在“取消”按钮接收焦点时取消错误消息,只需在“离开”事件中检查“取消”按钮.Focused标志,然后在“取消”按钮获得焦点时阻止消息


尽管如此,如果不需要模态对话框,通常认为避免模态对话框是良好的做法。因此,根据您的具体情况,您可能会决定用
工具提示替换
消息框
,这不会完全阻止UI线程。

当您单击
保存
按钮而不是
离开
事件时,验证输入。此外,使用
ErrorProvider
而不是消息框。不要使用Leave,验证事件是为此创建的。将“取消”按钮的CausesValidation属性设置为false。