【问题标题】:WinForms Button Click event and similar events depend on focusWinForms 按钮单击事件和类似事件取决于焦点
【发布时间】:2014-09-17 13:38:17
【问题描述】:

我有下一个情况:

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

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

有什么想法可以让TabPage 在我将注意力集中到隐藏的TextBox 之前处理所有鼠标事件吗?我尝试使用Application.DoEvents(),但没有帮助。

【问题讨论】:

  • 您正在尝试执行错误的事件。相反,请使用TabControlSelectingSelected 事件,具体取决于您是否要出于任何原因取消更改选项卡。
  • 谢谢,但这不符合我的需要。当您不更改活动页面时,不会触发 TabControlSelectingSelected 事件。假设焦点位于TabControl 之一,我按下另一个TabControl 的活动TabPageButton。然后整个活动页面发生变化,但Selected 事件当然不会被触发。
  • 你说的是TabControl嵌套在另一个TabControl中还是多个TabControls并排?
  • 多个,并排。
  • 那么我的回答仍然适用,但您需要使用TabControls 的EnterLeave 事件在您从一个更改为另一个时收到通知。

标签: c# winforms button focus tabcontrol


【解决方案1】:

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

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

更新

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

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

【讨论】:

  • 你可以在上面看到我的评论。我需要一个事件,这意味着所有Form 的活动页面都发生了变化。
  • 谢谢@LightBulb,但我无法在TabControlEnter 事件中生成服务器请求。我会按照您的建议仔细检查我的工作流程。如果其他人有其他建议,请随时分享:)
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多