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

Jon*_*Jon 11 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)
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法可能导致这个?这很关键,我无处可去.

Mar*_*ski 7

感谢Mangist的回应.它帮助我找到问题的原因.我遇到了MonthCalendar控件的问题,问题的根源是控件显示粗体日期的内部方法.我用一组日期填充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
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 1

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

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

注释掉该行可以修复它。

我希望微软不要像这样对框架进行重大更改,现在我必须更新数千个运行良好的用户应用程序。

编辑:我已收到 Infragistics 的答复,至少有一个解决方法。他们对于更改代码犹豫不决,因为自 2002 年以来就没有更改过。

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

       private void CloseCalendar()
      {
            dtpServiceDate.CloseUp();
      }
Run Code Online (Sandbox Code Playgroud)

  • @Marjan,这肯定是由 Windows 更新“KB3023222(适用于 Win 8)或 KB3023224(适用于 Win 7)引起的。您的另一台计算机运行良好的原因是因为它没有安装最新更新。该错误已由 Infragistics 确认。修复方法是在 UI 线程上调用 CloseCalendar() this.dtpServiceDate.BeginInvoke(new MethodInvoker(this.CloseCalendar)); 这将修复错误 (2认同)