c #Focus()似乎触发Leave()方法

我最后一次做任何严肃的编程是在25年前的C中,带有Kernighan和Ritchie的副本.对老练的业余爱好者请温柔!

从本质上讲,它是旧的可空日期选择器.我有一个完美的解决方案,有一个例外.我正在使用蒙版TextBox和MonthCalendar的组合.屏蔽的TextBox只显示数据集中的任何值(包括null),并接受日历中的值.按日历中的退格键会清除蒙版的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(); }));
点赞