我最后一次进行任何严肃的编程是 25 年前在 C 中使用 Kernighan 和 Ritchie 的副本。请对老年的业余爱好者保持温柔!

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

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

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

我的意图是将以下代码放入 MonthCalendar 的 Leave 事件中:
monthCalendar1.Visible = false;

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

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

提前谢谢了。

最佳答案

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

monthCalendar1.Visible = true;
this.BeginInvoke(new Action(() => { monthCalendar1.Select(); }));

关于c# Focus() 似乎触发了 Leave() 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19849714/

10-17 00:20