У меня возникла неприятная проблема с перерисовкой моего 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
Это работает только при начальной загрузке, но когда я прокручиваю список вниз, графический интерфейс на некоторое время блокируется, что очень раздражает.
Есть ли лучший способ выполнить эту задачу?
Спасибо!
Добавление
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)
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.