我试着用谷歌搜索,但找不到答案。
具有具有MonthCalendar控件并处理DateChanged事件的Windows窗体。该问题与鼠标单击更改月份有关。
我尝试在标签中显示一个计数器值,每次调用事件处理程序时,该计数器值都会向上计数。当月份改变时,事件处理程序被调用2次。
当在事件处理时调用MessageBox.Show("anything")时,事件处理程序似乎被调用了几次,日历开始永远向后倒退一个月。
有人知道为什么吗?
windows窗体类中的以下代码会导致所描述的行为:
private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
{
int i = int.Parse(labelDateChanged.Text);
labelDateChanged.Text = (i + 1).ToString();
MessageBox.Show(i.ToString());
}
private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
{
int i = int.Parse(labelDateSelected.Text);
labelDateSelected.Text = (i + 1).ToString();
}发布于 2011-01-11 22:11:26
不能捕获所有DateChanged事件,但解决方案是处理DateChanged、KeyUp和MouseUp事件。
DateChanged事件将布尔值IsDateChanged设置为true。KeyUp和MouseUp事件处理检查是否为IsDateChanged并执行必要的代码,并将IsDateChanged设置为false。
发布于 2010-12-31 01:46:47
切勿在事件处理程序中使用MessageBox。当焦点在控件的某个事件中被推开时,控件通常会变得非常混乱。当你点击next/prev按钮时,它会像这样持续滚动,因为它使用了一个计时器来允许连续滚动。每个定时器滴答声都会再次滚动日历。直到鼠标按键升起,该计时器才会被禁用。它看不到,消息框得到鼠标向上的消息,因为它抓住了焦点。这是本机Windows控件中的一个错误,但它从来没有经过测试。
使用Debug.WriteLine()或临时Console.WriteLine()会很有帮助,因为输出会显示在输出窗口中,并且不会干扰控制事件。
使事件多次触发的一种方法是意外订阅事件多次。一般来说,你不能假设你会得到多少事件,有一个人在点击它。请确保您的代码对此具有弹性。
解决此问题的一种方法是将事件的处理延迟到事件停止运行之后。用Control.BeginInvoke()做得很好。如下所示:
private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
this.BeginInvoke(new DateRangeEventHandler(delayedChanged), sender, e);
}
private void delayedChanged(object sender, DateRangeEventArgs e) {
// etc..
}发布于 2010-12-31 01:45:58
在看不到代码的情况下,很难确切地说出问题是什么,但很可能是您调用了一个方法来更改日期,以响应鼠标单击。Documentation for the DateChanged event说,
DateChanged事件在任何日期选择期间发生,无论是通过鼠标、键盘还是代码。
因此,当您单击鼠标更改日期时,将发生DateChanged事件。如果处理鼠标单击的代码还更改了日期,则DateChanged将再次发生。
仔细检查您的代码,看看您是否编写了在单击鼠标时在控件中设置日期的代码。如果您找不到它,请编辑您的问题并向我们显示您的代码,以便我们可以进一步帮助您。
https://stackoverflow.com/questions/4564355
复制相似问题