WinForms按钮单击事件和类似事件取决于焦点

本文关键字:事件 取决于 焦点 按钮 单击 WinForms | 更新日期: 2023-09-27 18:22:08

我有下一种情况:

  • 有一个客户端应用程序具有Form
  • Form包含几个TabControl
  • TabPageTabControl有不同的控制
  • 当用户单击任何控件时,我需要激活作为控件父级的TabPage。为此,我使用TabPage Enter事件
  • TabPage被激活时,我需要向服务器应用程序发出请求,并将焦点放在隐藏的TextBox上以禁用UI

问题是,当我在TabPage中的另一个TabPage上单击Button时。Enter事件处理程序我将焦点放在隐藏的TextBox上,似乎Button单击事件没有足够的时间进行处理。当我放置计时器并处理TabPage时。Enter事件在100毫秒之后,Button点击事件似乎被很好地触发了。同样的事情发生在所有的控件上:CheckBox没有被检查,RadioButton也没有。我不想使用定时器,因为这不是一个稳定的解决方案。

有什么想法吗?在我将焦点转移到隐藏的TextBox之前,我如何使TabPage处理所有鼠标事件?我试着使用Application.DoEvents(),但没有用。

WinForms按钮单击事件和类似事件取决于焦点

您正在使用错误的事件来进行错误的控制。

TabPageEnter事件将在该页面成为当前表单的活动控件时激发,而在某些条件下可能不会发生这种情况。相反,您需要使用TabControlSelectingSelected事件,这取决于您是否要取消切换到其他选项卡(请参阅Selecting事件的TabControlCancelEventArgs参数)。在您的情况下,Selecting事件更合适,因为在事件完成之前,它不允许切换到选定的选项卡(除非您正在向服务器执行异步请求)。此外,您可能不再需要使用隐藏的TextBox。

更新

关于对OP的评论,如果表单上有2个(或多个)TabControl,并且您希望在按下不同TabControl的任何选项卡中的按钮时收到通知,则可以将Enter事件用于TabControl。使用全局变量存储在Enter事件中激活的TabControl,然后向服务器发送对该激活TabControl的当前活动选项卡的请求。

如果这对你的场景不起作用,那么你需要仔细检查你的工作流程,看看它是否可以根据你想要实现的目标进行改进。