WinForms Button Click事件和类似事件取决于焦点

时间:2014-09-17 13:38:18

标签: c# winforms button focus tabcontrol

我有下一个情况:

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

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

在将焦点转移到隐藏TabPage之前,我怎么能让TextBox处理所有鼠标事件?我尝试使用Application.DoEvents(),但这没有帮助。

1 个答案:

答案 0 :(得分:1)

您正在使用错误的事件来控制您正在尝试的操作。

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

<强>更新

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

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