C# 按钮事件不';t在TabContainer中取消选项卡更改后激发

C# 按钮事件不';t在TabContainer中取消选项卡更改后激发,c#,winforms,C#,Winforms,我遇到了一个奇怪的问题,希望你们这些优秀的人能帮我解决 我在.NET4.5中有一个windows窗体应用程序。包含在主窗体中,我有一个拆分容器。左窗格包含一个TreeView,而右窗格包含一个包含多个选项卡的TabContainer 在第一个选项卡上是一个停靠面板,它是一个简单的表单,包含两个文本框和两个按钮(保存和取消)。我在启用按钮的两个文本框上都更改了TextChanged事件处理程序,并在验证面板时更改了一个处理程序 其思想是,当触发一个TextChanged事件时,面板被标记为“脏”,

我遇到了一个奇怪的问题,希望你们这些优秀的人能帮我解决

我在.NET4.5中有一个windows窗体应用程序。包含在主窗体中,我有一个拆分容器。左窗格包含一个TreeView,而右窗格包含一个包含多个选项卡的TabContainer

在第一个选项卡上是一个停靠面板,它是一个简单的表单,包含两个文本框和两个按钮(保存和取消)。我在启用按钮的两个文本框上都更改了TextChanged事件处理程序,并在验证面板时更改了一个处理程序

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

在大多数情况下,这很好。以下是一些案例:

  • 更改一些文本,然后单击“取消”-一切正常
  • 更改一些文本,然后单击“保存”-一切正常
  • 更改一些文本并单击树视图中的某个位置-所有内容都正常运行。将显示一个消息框,单击“保存”或“取消”将允许您继续
  • 更改一些文本并单击任何其他选项卡-这就是它变得扭曲的地方。将显示一个消息框。关闭消息框后,“保存”或“取消”按钮将不再触发其单击事件。因此,尝试将焦点更改为任何其他控件(甚至关闭应用程序)会导致消息框再次显示。你基本上被卡住了
我在TabControl.Selected处理程序中设置了断点,以确保在验证处理程序取消操作之前它没有触发,并且它没有。按钮的单击处理程序中的断点永远不会命中。我的点子快用完了


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

也许你的messagebox就是这样做的:改变焦点

不要试图在Enter、GotFocus、Leave、, LostFocus、Validating或Validated事件处理程序。这样做可能导致 您的应用程序或操作系统将停止响应。更多 有关详细信息,请参阅“键盘输入”中的WM_KILLFOCUS主题 参考”部分和“关于”部分的“消息死锁”部分 MSDN库中的“消息和消息队列”主题


您是否尝试了TabControl。选择而不是TabControl。选择的处理程序?您是否设置了正确的messagebox父项?@Sam:我没有。但我只是尝试了一下,结果是一样的。选择事件从不激发。不过打得不错。@fix\u喜欢\u编码:刚刚检查过。父项是正确的。选择应该是实现它的正确点,因为选择允许您取消选项卡更改。山姆说得很对谢谢,但我根本没想集中注意力。我试图阻止设置焦点。我没有看到验证事件中的代码,但如果显示MessageBox,它将具有焦点。所以这是不可能的。将错误文本放在状态字段中就可以了。