Изменение цвета фона ячейки списка

Работаю над десктопным приложением и имею, вероятно, глупую проблему, которая до сих пор сводит меня с ума.

У меня есть список, который получает свои строки из динамического источника.

Я пытаюсь изменить цвет определенных ячеек в элементе управления, если базовые данные для этой ячейки меняются на определенные условия.

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

Кроме того, этот список находится внутри 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

Я получаю чередующиеся цвета для строк и всего третьего столбца другого цвета.

Так что я предполагаю, что проблема заключается в том, что я пытаюсь перекрасить его после первого показа.


person Fenr_it    schedule 11.06.2019    source источник


Ответы (1)


Вам нужно вернуть true из обработчика, чтобы сообщить Xojo, что вы уже сделали рисование. В противном случае Xojo сделает свой собственный FillRect после вашего.

Имейте в виду, что это также переопределит окраску выделения. Это означает, что если строка выбрана, ваша ячейка не покажет это, если вы либо не вернете false в этом случае, либо не нарисуете свой собственный специальный цвет bg для этого случая.

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

person Thomas Tempelmann    schedule 11.06.2019
comment
Уже пытался вернуть true, все еще безрезультатно. Кроме того, если я поменяю код в обработчике на более простой, который просто рисует чередующиеся строки разных цветов, это работает нормально - person Fenr_it; 11.06.2019
comment
Тот факт, что он работает с напрямую заданными цветами, говорит о том, что у вас что-то не так с настройкой CellTag, а не с Redraw (в этом нет ничего плохого) - person Thomas Tempelmann; 11.06.2019
comment
Думаю, я нашел причину ... Я устанавливал теги с помощью RGB, и хотя сами теги правильно понимают (т.е. я вижу правильный цвет в свойстве celltag), кажется, что как только я передаю его объекту рисования, он не распознается . Выброс шестнадцатеричного значения внутри тега, кажется, работает так, как ожидалось. Проверим еще немного, чтобы убедиться. - person Fenr_it; 11.06.2019
comment
Нет, слишком рано сказано. Если список один раз окрашивается без цветов, каждое последующее обновление все равно не обновляет его. Если случайно я получаю условия до того, как элемент управления будет нарисован (=>, так что проверка действительно работает), тогда он будет нарисован, как я и ожидал - person Fenr_it; 11.06.2019
comment
Я предлагаю вам сделать небольшой тестовый проект и сделать его доступным, например. на github или, по крайней мере, опубликуйте весь соответствующий код, а не только его части, чтобы другие могли попробовать то, что вы делаете, и найти ошибку. - person Thomas Tempelmann; 11.06.2019
comment
К сожалению, поскольку это мой первый проект Xojo, а запросы на добавление новых функций являются непрерывными, код настолько запутан, что идентификация и удаление соответствующих частей на скрипке заняло бы время, которого у меня сейчас нет. Даже если это далеко не то, что я хотел, я, вероятно, пропущу эту часть и вернусь к ней позже, когда у меня будет больше места, чтобы посвятить ей это. Тем не менее, спасибо за помощь, она пригодится, когда я пересмотрю вещи - person Fenr_it; 26.07.2019