首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonthCalendar上的DateChanged事件问题

MonthCalendar上的DateChanged事件问题
EN

Stack Overflow用户
提问于 2010-12-31 00:31:47
回答 3查看 3K关注 0票数 1

我试着用谷歌搜索,但找不到答案。

具有具有MonthCalendar控件并处理DateChanged事件的Windows窗体。该问题与鼠标单击更改月份有关。

我尝试在标签中显示一个计数器值,每次调用事件处理程序时,该计数器值都会向上计数。当月份改变时,事件处理程序被调用2次。

当在事件处理时调用MessageBox.Show("anything")时,事件处理程序似乎被调用了几次,日历开始永远向后倒退一个月。

有人知道为什么吗?

windows窗体类中的以下代码会导致所描述的行为:

代码语言:javascript
复制
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();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-11 22:11:26

不能捕获所有DateChanged事件,但解决方案是处理DateChangedKeyUpMouseUp事件。

DateChanged事件将布尔值IsDateChanged设置为trueKeyUpMouseUp事件处理检查是否为IsDateChanged并执行必要的代码,并将IsDateChanged设置为false

票数 3
EN

Stack Overflow用户

发布于 2010-12-31 01:46:47

切勿在事件处理程序中使用MessageBox。当焦点在控件的某个事件中被推开时,控件通常会变得非常混乱。当你点击next/prev按钮时,它会像这样持续滚动,因为它使用了一个计时器来允许连续滚动。每个定时器滴答声都会再次滚动日历。直到鼠标按键升起,该计时器才会被禁用。它看不到,消息框得到鼠标向上的消息,因为它抓住了焦点。这是本机Windows控件中的一个错误,但它从来没有经过测试。

使用Debug.WriteLine()或临时Console.WriteLine()会很有帮助,因为输出会显示在输出窗口中,并且不会干扰控制事件。

使事件多次触发的一种方法是意外订阅事件多次。一般来说,你不能假设你会得到多少事件,有一个人在点击它。请确保您的代码对此具有弹性。

解决此问题的一种方法是将事件的处理延迟到事件停止运行之后。用Control.BeginInvoke()做得很好。如下所示:

代码语言:javascript
复制
    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) {
        this.BeginInvoke(new DateRangeEventHandler(delayedChanged), sender, e);
    }
    private void delayedChanged(object sender, DateRangeEventArgs e) {
        // etc..
    }
票数 2
EN

Stack Overflow用户

发布于 2010-12-31 01:45:58

在看不到代码的情况下,很难确切地说出问题是什么,但很可能是您调用了一个方法来更改日期,以响应鼠标单击。Documentation for the DateChanged event说,

DateChanged事件在任何日期选择期间发生,无论是通过鼠标、键盘还是代码。

因此,当您单击鼠标更改日期时,将发生DateChanged事件。如果处理鼠标单击的代码还更改了日期,则DateChanged将再次发生。

仔细检查您的代码,看看您是否编写了在单击鼠标时在控件中设置日期的代码。如果您找不到它,请编辑您的问题并向我们显示您的代码,以便我们可以进一步帮助您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4564355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档