取消 TabContainer 中的选项卡更改后,按钮事件不会触发

本文关键字:事件 按钮 TabContainer 选项 取消 | 更新日期: 2023-09-27 17:56:35

我遇到了一个奇怪的问题,我希望你们这些优秀的人可以帮助我。

我在 .NET 4.5 中有一个 Windows 窗体应用程序。包含在主窗体中,我有一个拆分容器。左窗格包含一个树视图,而右窗格包含一个具有多个选项卡的 TabContainer。

在这些选项卡中的第一个选项卡上是一个停靠面板,它是一个包含两个文本框和两个按钮(保存和取消)的简单窗体。我在启用按钮的两个文本框上都有 TextChanged 事件处理程序,在面板的"验证"上都有一个处理程序。

这个想法是,当其中一个 TextChanged 事件触发时,面板被标记为"脏",任何在面板外部更改焦点的尝试都会显示一条错误消息,要求您保存或取消更改,并且验证处理程序将 e.Cancel 设置为 true。

在大多数情况下,这工作正常。以下是一些情况:

  • 更改一些文本并单击取消 - 一切正常
  • 更改一些文本并单击保存 - 一切正常
  • 更改一些文本并单击树视图中的某个位置 - 一切都正确运行。将显示一个消息框,单击"保存"或"取消"将允许您继续。
  • 更改一些文本并单击任何其他选项卡 - 这就是它变得糟糕的地方。将显示一个消息框。关闭消息框后,"保存"或"取消"按钮都不会再触发其单击事件。因此,尝试将焦点更改为任何其他控件(甚至关闭应用程序)会导致再次显示消息框。你基本上被卡住了。

我将断点放在 TabControl.Selected 处理程序中,以确保在验证处理程序取消操作之前它没有触发,而它没有。永远不会命中按钮的单击处理程序中的断点。我的想法快用完了。

以前有人见过这样的事情吗?

取消 TabContainer 中的选项卡更改后,按钮事件不会触发

也许你的消息框就是这样做的:改变焦点。

不要尝试从输入、获取焦点、离开、 丢失焦点、正在验证或已验证的事件处理程序。这样做可能会导致 您的应用程序或操作系统停止响应。欲了解更多信息 信息,请参阅"键盘输入"中的WM_KILLFOCUS主题 参考"部分,以及"关于"的"消息死锁"部分 消息和消息队列"主题在 MSDN 库中位于 http://msdn.microsoft.com/library。

面板上的 MSDN。验证