Странная ошибка в MonthCalendar только что началась из ниоткуда
Этот отчет о сбоях начал работать 2 дня назад у многих наших пользователей. У нас не было обновлений нашего кода, и эта ошибка происходит в нескольких версиях. Некоторым из этих версий старомодно, поэтому не похоже, что обновление сломало что-то. Это приложение .NET 4.0 с использованием Infragistics 2014 Vol 2. Поддержка Infragistics, похоже, кажется ошибкой в MonthCalendar для Windows 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)
Есть ли у кого-нибудь идеи, что может быть причиной этого? Это критично, и мне некуда даже начинать.
Ответы
Ответ 1
Спасибо за ответ Мангиста. Это помогает мне найти причину проблемы. У меня были проблемы с элементом MonthCalendar, источником проблемы были внутренние методы управления отображением выделенных жирных дат. Я заполнял свойство BoldedDates массивом дат. Это заставило элемент управления автоматически вызвать функцию UpdateBoldedDates(), и произошел сбой.
Все, что я сделал, это то, что я заменил код, добавив полужирный номер один за другим (потери производительности нет). При этом функция UpdateBoldedDates() должна вызываться вручную (что спасло мой life:)).
Итак, после заполнения 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
Ответ 2
Вот сводка 3064711 для исправления Microsoft для Crash:
https://support.microsoft.com/en-us/kb/3064711
Проблемы решены:
Предположим, что вы используете приложение Windows Forms. Если в некоторых случаях приложение содержит элемент управления System.Windows.Forms.MonthCalendar, будет выбрано исключение InvalidOperationException:
Операция недействительна из-за текущего состояния объекта.
MS Connect Thread:
https://connect.microsoft.com/VisualStudio/feedback/details/1345128/errors-after-installing-kb3023222-update
Ответ 3
После того как я установил обновления Windows со вторника и перезагрузил свой компьютер, я мог бы легко решить проблему. Получается, что этот (6-летний!) Код теперь терпит неудачу .NET, хотя он работает годами. У меня есть код в одной из моих форм, чтобы закрыть календарь после того, как пользователь выберет дату. Теперь эта строка кода рушится, поэтому я ее удалил. Похоже, календарь автоматически закрывается сейчас, не требуя этого больше.
private void dtpServiceDate_ValueChanged(object sender, EventArgs e)
{
dtpServiceDate.CloseUp(); // <-- this line crashes now
Комментирует, что строка исправляет его.
Я бы хотел, чтобы Microsoft не выпускала такие изменения в инфраструктуре, как сейчас, теперь мне нужно обновить тысячи приложений, которые работают очень хорошо.
EDIT: Я получил ответ от Infragistics, по крайней мере, для обходного пути. Они не решаются изменить свой код, поскольку он не изменился с 2002 года.
private void dtpServiceDate_ValueChanged(object sender, EventArgs e)
{
this.dtpServiceDate.BeginInvoke(new MethodInvoker(this.CloseCalendar));
}
private void CloseCalendar()
{
dtpServiceDate.CloseUp();
}