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

C# WinForms按钮单击事件和类似事件取决于焦点,c#,winforms,button,focus,tabcontrol,C#,Winforms,Button,Focus,Tabcontrol,我有下一种情况: 有一个带有表单的客户端应用程序 表单包含一些选项卡控件 在TabControl的TabPage上有不同的控件 当用户单击任何控件时,我需要激活作为控件父控件的选项卡页。为此,我使用了一个选项卡页输入事件 当选项卡页面被激活时,我需要向服务器应用程序发出请求,并将焦点放在隐藏的文本框以禁用UI 问题是,当我在另一个选项卡页面上单击按钮时,在选项卡页面输入事件处理程序中,我将注意力集中在隐藏的文本框,似乎按钮单击事件没有足够的时间处理。当我在100毫秒后放入计时器和句柄选项卡页

我有下一种情况:

  • 有一个带有
    表单的客户端应用程序
  • 表单
    包含一些
    选项卡控件
  • TabControl
    TabPage
    上有不同的控件
  • 当用户单击任何控件时,我需要激活作为控件父控件的
    选项卡页
    。为此,我使用了一个
    选项卡页
    输入
    事件
  • 选项卡页面
    被激活时,我需要向服务器应用程序发出请求,并将焦点放在隐藏的
    文本框
    以禁用UI
问题是,当我在另一个
选项卡页面
上单击
按钮时,在
选项卡页面
输入
事件处理程序中,我将注意力集中在隐藏的
文本框
,似乎
按钮
单击事件没有足够的时间处理。当我在100毫秒后放入计时器和句柄
选项卡页面
进入
事件时,
按钮
点击事件似乎启动良好。所有控件都会发生同样的情况:
CheckBox
不会被选中,
RadioButton
也会被选中。我不想使用定时器,因为这不是一个稳定的解决方案


在我聚焦到隐藏的
TextBox
之前,我如何让
TabPage
处理所有鼠标事件?我尝试使用
应用程序.DoEvents()
,但没有任何帮助。

您使用了错误的事件来表示您尝试执行的操作的错误控件

Enter
TabPage
页面成为当前表单的活动控件时,将触发该事件,在某些情况下可能不会发生该事件。相反,您需要使用
TabControl
Selecting
Selected
事件,这取决于您是否要取消切换到其他选项卡(请参阅
Selecting
事件的参数)。在您的情况下,
选择
事件更合适,因为在事件完成之前,它不允许切换到所选选项卡(除非您对服务器执行异步请求)。此外,您可能不再需要使用隐藏的文本框

更新

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


如果这对您的场景不起作用,那么您需要仔细检查您的工作流程,看看是否可以根据您想要完成的任务进行改进。

您使用了一个错误的事件来完成您试图执行的任务。相反,请使用
选择
所选
事件的
选项卡控件
,具体取决于您是否希望出于任何原因取消更改选项卡。谢谢,但这不符合我的需要<代码>选择
所选
选项卡控件的事件
在不更改活动页面时不会被触发。假设焦点在一个
TabControl
中,我按下另一个
TabControl
的活动
TabPage
按钮。然后,活动页面将全部更改,但选择的
事件当然不会触发。您是说嵌套在另一个
TabControl
中的
TabControl
还是多个
TabControl
s并排?多个,并排。然后我的答案仍然适用,但您需要使用
Enter
Leave
事件
TabControl
s,以便在从一个更改到另一个时收到通知。您可以在上面看到我的评论。我需要一个事件,这意味着所有
表单的活动页面都已更改。谢谢,@LightBulb,但我无法在
选项卡控件
输入
事件中生成服务器请求。我会按照你的建议仔细检查我的工作流程。如果其他人还有其他建议,请随时分享:)