Странная ошибка в 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();
      }