在桌面应用程序上工作,可能遇到一些愚蠢的问题,但仍然使我发疯。
我有一个列表框,它是从动态源获取行的。
如果该单元格的基础数据更改为特定条件,我将尝试更改控件中特定单元格的前景色。
在检查条件之前,控件也会被绘制一次,这意味着每个单元格都开始用相同的(白色)原色绘制。
此外,此列表框位于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事件,但是显示的最终结果始终是默认的(白色)彩色单元格。
我尝试按顺序致电
在第一段代码之后,无济于事。
因此,现在我对下一步尝试不知所措。
如果我将事件处理程序替换为
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
我为行和整个第三列使用不同颜色的交替颜色。
所以我想我想在第一次显示它后重新粉刷它是问题所在。
答案 0 :(得分:1)
您需要从处理程序中返回true,以便告诉Xojo您已经完成了绘画。否则,Xojo将在您之后执行自己的FillRect。
请记住,这也会覆盖选择颜色。这意味着,如果选中该行,除非您在这种情况下返回false或为此情况绘制自己的特殊bg颜色,否则您的单元格将不会显示。
在我看来,您所说的是背景色,而不是前景色。您也许可以相应地更新问题标题。