4

上一次我做任何严肃的编程是 25 年前用 C 语言编写的 Kernighan 和 Ritchie 的副本。请对上了年纪的素人温柔一点!

从本质上讲,它是旧的可空日期选择器。我有一个解决方案运行良好,但有一个例外。我正在使用蒙面文本框和 MonthCalendar 的组合。屏蔽的 TextBox 仅显示数据集中的任何值(包括 null)并接受日历中的值。在日历中按退格键会清除被屏蔽的文本框。这一切都非常简单。我现在需要做的就是在日历失去焦点时隐藏它。一个简单的例子演示了我遇到的问题:

创建一个带有作为初始焦点的文本框、一个蒙版文本框和一个隐藏的 MonthCalendar 的表单。在被屏蔽的文本框的 Enter 事件中,我有以下代码:

monthCalendar1.Visible = true;
monthCalendar1.Focus();

我的意图是将以下代码放入 MonthCalendar 的 Leave 事件中:

monthCalendar1.Visible = false;

由于某种原因,一旦日历获得焦点并立即再次隐藏日历,就会触发此代码。调试确认此代码已被触发。如果 Leave 事件为空,MonthCalendar 确实会获得焦点并保留它,因为可以使用箭头键导航日历。

任何人都可以向老顽固解释这种行为,或者更好的是,给我一个指向我正在尝试做的事情的指针。

提前谢谢了。

4

2 回答 2

2

一种解决方法是将 MonthCalendar 控件的焦点延迟到 Enter 事件完成触发之后:

monthCalendar1.Visible = true;
this.BeginInvoke(new Action(() => { monthCalendar1.Select(); }));
于 2013-11-08T01:10:35.537 回答
1

引用:

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

来自MSDN。他们还讨论了当你进入时会发生哪些事件,这取决于你如何进入:)

于 2013-11-08T01:12:20.120 回答