WinForms按钮单击事件和类似事件取决于焦点
本文关键字:事件 取决于 焦点 按钮 单击 WinForms | 更新日期: 2023-09-27 18:22:08
我有下一种情况:
- 有一个客户端应用程序具有
Form
Form
包含几个TabControl
- 对
TabPage
和TabControl
有不同的控制 - 当用户单击任何控件时,我需要激活作为控件父级的
TabPage
。为此,我使用TabPage
Enter
事件 - 当
TabPage
被激活时,我需要向服务器应用程序发出请求,并将焦点放在隐藏的TextBox
上以禁用UI
问题是,当我在TabPage
中的另一个TabPage
上单击Button
时。Enter
事件处理程序我将焦点放在隐藏的TextBox
上,似乎Button
单击事件没有足够的时间进行处理。当我放置计时器并处理TabPage
时。Enter
事件在100毫秒之后,Button
点击事件似乎被很好地触发了。同样的事情发生在所有的控件上:CheckBox
没有被检查,RadioButton
也没有。我不想使用定时器,因为这不是一个稳定的解决方案。
有什么想法吗?在我将焦点转移到隐藏的TextBox
之前,我如何使TabPage
处理所有鼠标事件?我试着使用Application.DoEvents()
,但没有用。
您正在使用错误的事件来进行错误的控制。
TabPage
的Enter
事件将在该页面成为当前表单的活动控件时激发,而在某些条件下可能不会发生这种情况。相反,您需要使用TabControl
的Selecting
或Selected
事件,这取决于您是否要取消切换到其他选项卡(请参阅Selecting
事件的TabControlCancelEventArgs
参数)。在您的情况下,Selecting
事件更合适,因为在事件完成之前,它不允许切换到选定的选项卡(除非您正在向服务器执行异步请求)。此外,您可能不再需要使用隐藏的TextBox。
更新
关于对OP的评论,如果表单上有2个(或多个)TabControl
,并且您希望在按下不同TabControl
的任何选项卡中的按钮时收到通知,则可以将Enter
事件用于TabControl
。使用全局变量存储在Enter
事件中激活的TabControl
,然后向服务器发送对该激活TabControl
的当前活动选项卡的请求。
如果这对你的场景不起作用,那么你需要仔细检查你的工作流程,看看它是否可以根据你想要实现的目标进行改进。