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


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

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)

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


10021
2018-05-15 14:58


起源

那种方法似乎没有任何东西。 referencesource.microsoft.com/#System.Windows.Forms/winforms/... - SLaks
是不是这些机器得到了.Net框架更新?你有没有更新的.Net framework 4.0的机器进行测试吗? - Habib
@SLaks我知道但是这个例外是由我们的一个用户每5或10分钟抛出一次。他们混合使用Win7 SP1,Win8和Vista上的一些。我无法在我的机器上发生错误,并且我有最新的更新。我可以继续尝试复制它。 - Mangist
它必须与Windows更新有关,因为它仅在星期二开始发生。我似乎无法在可能影响此更新的更新列表中找到任何内容,大多数更新是针对.NET 3.5和4.5以及Windows 8.1的安全更新。此问题在所有操作系统上都会发生。 - Mangist


答案:


感谢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

7
2018-05-29 10:54





这是崩溃的Microsoft Hotfix汇总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


4
2018-06-30 12:19



答案的基本部分在上面的帖子中。 @ d1no刚刚发布了Microsoft提供的解决方案,这是防止相关问题的修补程序。此问题将过时,因为该解决方案已集成到Windows更新中,并且不会再次出现(希望如此)。因此,这些评论不是必要的。 - Marjan Slavkovski


从星期二安装Windows更新并重新启动我的PC后,我可以轻松地复制问题。事实证明,这个(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();
      }

1
2018-05-15 17:13



我有同样的问题,我不知道问题在哪里......很奇怪,问题在同一天开始......我无法修复它,我不知道为什么会发生这种情况。我有另一台机器完全运行应用程序,但所有其他机器都有相同的问题。也许它是由一些更新引起的。我找不到任何东西,尝试了数百次搜索..我很生气,有谁知道发生了什么事? - Marjan Slavkovski
@Marjan肯定是由Windows Update“KB3023222(适用于Win 8)或KB3023224(适用于Win 7)引起的。您的其他机器正常运行的原因是因为它没有安装最新的更新。该错误由Infragistics确认。修复是在UI线程this.dtpServiceDate.BeginInvoke(new MethodInvoker(this.CloseCalendar))上调用CloseCalendar()调用;这将修复错误 - Mangist
在我的情况下,该错误的原因是Bolded日期功能。我通过设置一个粗体日期数组并逐个设置它们来尝试这两个选项。在粗体日期数组(DateTime数组)的情况下,控件正在调用导致崩溃的'UpdateBoldedDates()'函数。在通过调用'AddBoldedDate(theDate)'函数逐个设置粗体日期的情况下,我必须手动调用'UpdateBoldedDates()'。如果我没有打电话说不会发生异常。当我取消注释该功能时,它崩溃了。该控件是MonthCalendar。 - Marjan Slavkovski
我也遇到了Bolded日期的问题。你找到了解决方案吗? - dspiegs
我在单独的答案中发布了我的解决方案。谢谢! - Marjan Slavkovski