【问题标题】:Button events don't fire after canceling a tab change in a TabContainer取消 TabContainer 中的选项卡更改后,按钮事件不会触发
【发布时间】:2014-04-03 22:26:43
【问题描述】:

我遇到了一个奇怪的问题,希望各位优秀的人能帮助我解决这个问题。

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

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

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

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

  • 更改一些文本并单击取消 - 一切正常
  • 更改一些文本并点击保存 - 一切正常
  • 更改一些文本并单击 TreeView 内的某处 - 一切正常。将显示一个消息框,单击“保存”或“取消”将允许您继续。
  • 更改一些文本并单击任何其他选项卡 - 这就是问题所在。将显示一个消息框。关闭消息框后,Save 或 Cancel 按钮将不再触发其 Click 事件。因此,尝试将焦点更改为任何其他控件(甚至关闭应用程序)会导致再次显示消息框。你基本上陷入了困境。

我在 TabControl.Selected 处理程序中设置了断点,以确保在 Validating 处理程序取消操作之前它没有触发,但事实并非如此。按钮的 Click 处理程序中的断点永远不会被命中。我的想法不多了。

有没有人见过这样的事情?

【问题讨论】:

  • 您是否尝试过 TabControl.Selecting 而不是 TabControl.Selected 处理程序?
  • 您是否设置了正确的消息框父级?
  • @Sam:我没有。但我只是试了一下,结果是一样的。 Selecting 事件永远不会触发。不过,打得很好。
  • @fix_likes_coding :刚刚检查过。父母是对的。
  • 选择应该是实现它的正确点,因为选择允许您取消选项卡更改。山姆是绝对正确的

标签: c# winforms


【解决方案1】:

也许你的消息框确实/做到了:改变焦点。

不要尝试从 Enter、GotFocus、Leave、 LostFocus、Validating 或 Validated 事件处理程序。这样做会导致 您的应用程序或操作系统停止响应。更多 信息,请参阅“键盘输入”中的 WM_KILLFOCUS 主题 参考”部分,以及“关于”的“消息死锁”部分 消息和消息队列”主题在 MSDN 库中 http://msdn.microsoft.com/library.

MSDN on Panel.Validating

【讨论】:

  • 谢谢,但我根本没有试图集中注意力。我试图停止设置焦点。
  • 我还没有看到验证事件中的代码,但是如果你显示一个MessageBox,它就会有焦点。所以这是不行的。将错误文本放在状态字段中就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2020-12-27
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多