Изменение цвета фона ячейки списка - PullRequest
0 голосов
/ 11 июня 2019

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

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

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

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

Кроме того, этот список находится внутри 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 для определенной ячейки
  • Недействительно для всего списка вместо обновления (поскольку вы никогда не знаете)
  • Обновить на содержащем холсте

После первого блока кода безрезультатно.

Так что теперь я не знаю, что делать дальше.

Редактировать

Если я заменю обработчик события на

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

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

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

1 Ответ

1 голос
/ 11 июня 2019

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

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

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

...