Работаю над десктопным приложением и имею, вероятно, глупую проблему, которая до сих пор сводит меня с ума.
У меня есть список, который получает свои строки из динамического источника.
Я пытаюсь изменить цвет определенных ячеек в элементе управления, если базовые данные для этой ячейки меняются на определенные условия.
Элемент управления также рисуется один раз до того, как условие начинает проверяться, что означает, что все ячейки начинают окрашиваться одним и тем же (белым) передним цветом.
Кроме того, этот список находится внутри Canvas, а этот Canvas, в свою очередь, находится внутри элемента управления Window.
Этот код проверяет условие по сравнению со всеми строками в списке:
for each dict as Dictionary in WidgetsDictionary
Dim site as String = dict.Value("Site").StringValue
Dim device as String = dict.Value("Device").StringValue
Dim sensor as String = dict.Value("Sensor").StringValue
for intC as integer = 0 to actualLstBox.ListCount
Dim siteComp as String = actualLstBox.Cell(intC,4)
Dim deviceComp as String = actualLstBox.Cell(intC,0)
Dim sensorComp as String = actualLstBox.Cell(intC,1)
if actualLstBox.Cell(intC,4) = site AND
actualLstBox.Cell(intC,1) = sensor AND
actualLstBox.Cell(intC,0) = device then
actualLstBox.CellTag(intC,2) = RGB(255, 192, 203)
exit For
end
next
next
Где WidgetsDictionary содержит условия, которые мне нужно проверить.
И это работает, если я проверю CellTags после его запуска, я обнаружу, что они установлены правильно, где они должны быть.
Теперь, если после этого кода я позвоню
actualLstBox.Refresh()
Примечание. Я знаю, что функция "Обновить" не оптимальна, но мне нужно, чтобы она активировалась как можно скорее
Я вижу, как код переходит к событию CellBackgroundPaint в ListBox.
Вот это у меня есть
If (row<me.ListCount ) then
If Me.CellTag(row, column ) <>nil Then
g.ForeColor = me.CellTag(row,column)
g.FillRect(0, 0, g.Width, g.Height)
End If
end
И снова я вижу, что этот код выполняется правильно.
Итак, я ожидаю, что список будет перерисован с правильными ячейками в новом цвете.
Но ничего не меняется, я вижу, что событие CellBackgroundPaint срабатывает после каждого обновления, но отображаемый конечный результат всегда представляет собой ячейки по умолчанию (белые).
Я пытался позвонить, чтобы
- InvalidateCell в конкретной ячейке
- Недействителен для всего списка вместо обновления (поскольку вы никогда не знаете)
- Обновить на содержащем Canvas
После первого блока кода безрезультатно.
Так что теперь я в недоумении, что попробовать дальше.
Редактировать
Если я заменю обработчик событий на
If (row mod 2) = 0 Then
g.ForeColor = RGB(232,235,255)
g.FillRect 0, 0, g.Width, g.Height
End If
if column = 2 then
g.ForeColor = RGB(255,253,208)
g.FillRect 0, 0, g.Width, g.Height
end
Я получаю чередующиеся цвета для строк и всего третьего столбца другого цвета.
Так что я предполагаю, что проблема заключается в том, что я пытаюсь перекрасить его после первого показа.