这个崩溃报告是在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)
有没有人有任何想法可能导致这个?这很关键,我无处可去.
感谢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)
在我安装了周二的 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)