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