MonthCalendar中的奇怪错误刚刚开始发生

时间:2015-05-15 14:58:12

标签: c# winforms

这个崩溃报告是在2天前从很多用户开始的。我们的代码没有更新,这个错误发生在多个版本上。其中一些版本已经存在多年了,所以它并不像更新一样。它是使用Infragistics 2014 Vol 2的.NET 4.0应用程序.Infragistics支持似乎认为它是Month Forms中的一个错误,但是我无法在线找到任何东西。从崩溃转储的屏幕截图看,所有用户正在做的是点击下拉日历,当他们收到此错误时。我无法复制它。

System.InvalidOperationException: Operation is not valid due to the current state of the object.
at System.Windows.Forms.MonthCalendar.WndProc(Message& m)
at Infragistics.Win.MonthDropDownWithUIPermissions.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

有没有人有任何想法可能导致这个?这很重要,我无处可去。

3 个答案:

答案 0 :(得分:7)

感谢Mangist的回应。它帮助我找到问题的原因。我遇到了 MonthCalendar 控件的问题,问题的根源是控件显示粗体日期的内部方法。我正在使用Dates数组填充 BoldedDates 属性。这导致控件自动调用 UpdateBoldedDates()函数并发生了崩溃。 我所做的只是通过逐个添加粗体日期来替换代码(没有性能损失)。这样做时, UpdateBoldedDates()函数必须手动调用(这可以节省我的生命:))。 因此,在用粗体日期填充 MonthCalendar 之后,我使用了"解决方法"并在工作线程中调用 UpdateBoldedDates()函数。这是我的代码(在Visual Basic.NET中):

Private Sub UpdateBoldedDatesWT()
    mcCalendar.UpdateBoldedDates()
End Sub

Public Sub LoadBoldedDates()

    Dim bDates As List(Of Date)

    Try
        Dim dExt As New DatesHelper(sqlConn)
        bDates = dExt.GetAppointmentDates(mcCalendar.SelectionStart)
        mcCalendar.RemoveAllBoldedDates()

        For Each d As Date In bDates
            mcCalendar.AddBoldedDate(d)
        Next

        mcCalendar.BeginInvoke(New MethodInvoker(AddressOf UpdateBoldedDatesWT))
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "Error loading bolded dates")
    End Try

End Sub

答案 1 :(得分:4)

以下是崩溃的Microsoft修补程序汇总3064711:

https://support.microsoft.com/en-us/kb/3064711

问题解决了:

假设您正在运行Windows窗体应用程序。当应用程序在某些情况下处置System.Windows.Forms.MonthCalendar控件时,将抛出以下InvalidOperationException异常: 由于对象的当前状态,操作无效。

MS Connect线程: https://connect.microsoft.com/VisualStudio/feedback/details/1345128/errors-after-installing-kb3023222-update

答案 2 :(得分:1)

从星期二安装了Windows更新并重启了我的电脑后,我可以轻松地复制问题。事实证明,这个(6岁!)代码现在崩溃.NET,即使它已经工作了多年。我在其中一个表单中有代码,以便在用户选择日期后关闭日历。现在这行代码崩溃了,所以我删除了它。看起来日历会自动关闭,而不再需要它。

private void dtpServiceDate_ValueChanged(object sender, EventArgs e)
{
    dtpServiceDate.CloseUp(); // <-- this line crashes now

注释掉该行修复了它。

我希望微软不会像这样发布对框架的重大更改,现在我必须更新数千个用户正常工作的应用程序。

编辑:我收到了Infragistics的答复,至少是为了解决方法。他们对改变他们的代码犹豫不决,因为自2002年以来它没有改变。

private void dtpServiceDate_ValueChanged(object sender, EventArgs e)
        {
            this.dtpServiceDate.BeginInvoke(new MethodInvoker(this.CloseCalendar));
        }

       private void CloseCalendar()
      {
            dtpServiceDate.CloseUp();
      }