C#DateTimePicker陷入循环

我在C#中有一个datetimepicker。 当我点击它时,它会展开以显示每月日历,当我单击向左箭头返回一个月时,它会更改值并调用我的事件。 该事件包括太多代码,包括在这里,但它不用说几个函数。
我遇到的问题是,当我点击左箭头时,它会陷入某种循环并持续下降几个月,我无法阻止它。 正在调用的函数之一包含一个Application.DoEvents(),如果我注释掉它不会卡在循环中,但我需要该命令来更新接口的另一部分。 知道为什么会这样吗?

我有时可以使用此代码复制它,有时它只会执行几次,有时它会卡在循环中。

private void DateTimePickerValueChangedEvent(object sender, EventArgs e) { afunction(); } private void afunction() { listView1.Clear(); panel1.Visible = true; Application.DoEvents(); } 

我也有同样的问题。 在我的情况下,我没有调用DoEvents而是更新Crystal Report视图。 我找到的唯一解决方法是在CloseUp事件而不是ValueChanged或TextChanged上更新我的视图。

斯科特,你是怎么最终纠正你的问题的?

DateTimePicker ValueChanged事件是错误的。 按此页面上的Microsoft Windows窗体小组https://connect.microsoft.com/VisualStudio/feedback/details/1290685/debugging-datetimepicker-event-hangs-vs :

“DateTimePicker控件将鼠标挂钩作为其function的一部分安装,但是当调试器在断点上停止WinForms应用程序时,如果VS碰巧收到鼠标消息,它就会出现死锁的可能性。就目前而言,死锁是不幸的DateTimePicker设计的结果。当单击下拉列表以显示日历时,将安装鼠标挂钩。这意味着不应在日历处于活动状态时调用的任何事件处理程序中发送断点。我们目前正在调查是否可以解决这个问题,如果我们能够提供修复,我们将用更多信息更新这个post。“

如果没有看到任何代码,请尝试以下步骤:

  1. 注释掉整个事件处理程序,看看它运行的速度有多快。
  2. 一次取消注释一行,以查看哪些是导致最多问题的。
  3. 分析那些方法调用。
  4. 利润!

你可以试试几件事。 摆脱ChangedEvent中的DoEvents。 可能在一段时间后(thread.sleep()?)调用单独函数内的doevents。

我知道doevents确实会导致问题,但我很少使用它。