Devexpress XtraGrid CustomDrawCell: перерисовка ячейки только при наведении курсора мыши/щелчке по элементам формы

У меня возникла неприятная проблема с перерисовкой моего devexpress XtraGrid.

Я использую этот код для рисования значков в ячейке:

Private Sub CtlGridView_CustomDrawCell(sender As Object, e As RowCellCustomDrawEventArgs) Handles CtlGridView.CustomDrawCell
        If e.Column.FieldName = NameOf(DataModel.Contract.Status) Then
            Dim view As GridView = CType(sender, GridView)
            Dim iconKeys As New List(Of String)

        ' Check Validation
        Dim guidString As String = view.GetRowCellValue(e.RowHandle, NameOf(DataModel.Contract.GuidId)).ToString()
        Dim guidId As Guid

        If Guid.TryParse(guidString, guidId) Then
            Dim validationResult As New DataModel.ValidationResult()

            ' Check if result is in cache
            If Not _validationCache.TryGetValue(guidId, validationResult) Then
                Task.Run(Sub()
                             Using taskContext As New DbContext()
                                 Dim entry As DataModel.Contract= taskContext.Contracts.Find(guidId)
                                 If entry IsNot Nothing Then
                                     validationResult = entry.Validate(taskContext, exitOnFirstError:=True)
                                 Else
                                     validationResult = New DataModel.ValidationResult
                                 End If

                                 ' Add result to cache
                                 _validationCache.TryAdd(guidId, validationResult)

                             End Using
                         End Sub)
            End If

            If cellValue = "O" Then
                iconKeys.Add("trackingchanges_showmarkup")

            ElseIf cellValue = "T" Then
                iconKeys.Add("trackingchanges_trackchanges")

            ElseIf cellValue = "I" Then
                iconKeys.Add("functionsinformation")

            ElseIf cellValue = "G" Then
                iconKeys.Add("trackingchanges_locktracking")

            ElseIf cellValue = "W" Then
                iconKeys.Add("trackingchanges_allmarkup")

            ElseIf cellValue = "K" Then
                iconKeys.Add("business_cash")
            End If

            If validationResult.Icon IsNot Nothing Then
                iconKeys.Add(validationResult.Icon)
            End If

            If iconKeys.Count > 0 Then
                Dim iconSize As New Size(32, 32)
                IconHelper.DrawIcons(e, iconKeys, _imageCollection, iconSize)
            End If

            e.Handled = True

        End If

    End If
End Sub

Как видите, я использую задачу для выполнения проверки и с результатом проверки получаю обратно имя значка, которое затем использую для рисования в ячейке. Это работает без проблем, но есть проблема: значок отображается только после перемещения мыши по ячейке или нажатия некоторых кнопок в форме. Это связано с перерисовкой формы, но я не знаю, как с этим справиться.

Вот ссылка на видео, демонстрирующее эффект: https://drive.google.com/file/d/1EAXSd2S4wczKdtq2E4KFR47eEAtQRY3L/view?usp=drive_link

К сожалению, маленькая птичка тоже не может мне помочь :-)

Кажется, все работает нормально, но некоторые значки проверки появляются первыми после наведения на него указателя мыши.

Я попытался сделать недействительным все представление/строку/ячейку следующим образом:

            If Not _validationCache.TryGetValue(guidId, validationResult) Then
                Task.Run(Sub()
                             Using taskContext As New DbContext()
                                 Dim entry As DataModel.InstAuftrag = taskContext.InstAuftraege.Find(guidId)
                                 If entry IsNot Nothing Then
                                     validationResult = entry.Validate(taskContext, exitOnFirstError:=True)
                                 Else
                                     validationResult = New DataModel.ValidationResult
                                 End If

                                 ' Add result to cache
                                 _validationCache.TryAdd(guidId, validationResult)

                             End Using
                         End Sub)
                   view.invalidate
            End If

Это работает только при начальной загрузке, но когда я прокручиваю список вниз, графический интерфейс на некоторое время блокируется, что очень раздражает.

Есть ли лучший способ выполнить эту задачу?

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавление

                             view.RefreshRow(e.RowHandle)

здесь:

            Task.Run(Sub()
                         Using taskContext As New DbContext()
                             Dim entry As DataModel.Contract= taskContext.Contracts.Find(guidId)
                             If entry IsNot Nothing Then
                                 validationResult = entry.Validate(taskContext, exitOnFirstError:=True)
                             Else
                                 validationResult = New DataModel.ValidationResult
                             End If

                             ' Add result to cache
                             _validationCache.TryAdd(guidId, validationResult)
                             view.RefreshRow(e.RowHandle)
                         End Using
                     End Sub)

Другие вопросы по теме