奇怪的错误在月历刚刚开始发生的地方

本文关键字:刚刚开始 月历 错误 | 更新日期: 2023-09-27 17:49:27

这个崩溃报告是从我们的很多用户2天前开始的。我们的代码没有更新,这个错误发生在多个版本上。其中一些版本已经有好几年的历史了,所以并不是更新弄坏了什么东西。这是一个。net 4.0应用程序,使用了Infragistics 2014 Vol 2。inffragistics支持人员似乎认为这是Windows窗体月历中的一个bug,但我在网上找不到任何东西。从崩溃转储的屏幕截图来看,当用户得到这个错误时,他们所做的就是点击下拉日历。我没能复制它。

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)

有人知道是什么原因导致的吗?这很重要,我甚至没有地方开始。

奇怪的错误在月历刚刚开始发生的地方

感谢管理员的回复。它帮助我找到了问题的原因。我在MonthCalendar控件上遇到了问题,问题的根源是控件的内部方法,用于显示固定日期。我正在用日期数组填充BoldedDates属性。这会导致控件自动调用UpdateBoldedDates()函数,从而导致崩溃。我所做的只是通过逐个添加保存日期来替换代码(没有性能损失)。当这样做时,UpdateBoldedDates()函数必须手动调用(这挽救了我的生命:))。因此,在用bold日期填充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

这是一个Microsoft Hotfix rollup 3064711 for the Crash:

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

解决问题:

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

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

在我安装了周二的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();
      }