更改列表框单元格的背景颜色

时间:2019-06-11 11:25:37

标签: xojo

在桌面应用程序上工作,可能遇到一些愚蠢的问题,但仍然使我发疯。

我有一个列表框,它是从动态源获取行的。

如果该单元格的基础数据更改为特定条件,我将尝试更改控件中特定单元格的前景色。

在检查条件之前,控件也会被绘制一次,这意味着每个单元格都开始用相同的(白色)原色绘制。

此外,此列表框位于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包含我需要检查的条件。

那行得通,如果我在运行CellTag后对其进行检查,我发现它们正确设置了应该放置的位置。

现在,如果我在该代码之后致电

actualLstBox.Refresh()

注意:我知道刷新不是最佳选择,但我需要尽快启动

我看到代码跳到ListBox的CellBackgroundPaint事件

我有这个

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

我为行和整个第三列使用不同颜色的交替颜色。

所以我想我想在第一次显示它后重新粉刷它是问题所在。

1 个答案:

答案 0 :(得分:1)

您需要从处理程序中返回true,以便告诉Xojo您已经完成了绘画。否则,Xojo将在您之后执行自己的FillRect。

请记住,这也会覆盖选择颜色。这意味着,如果选中该行,除非您在这种情况下返回false或为此情况绘制自己的特殊bg颜色,否则您的单元格将不会显示。

在我看来,您所说的是背景色,而不是前景色。您也许可以相应地更新问题标题。