デスクトップアプリケーションで作業していて、おそらくばかげた問題を抱えていて、まだ私を怒らせています。
動的ソースから行を取得するリストボックスがあります。
そのセルの基になるデータが特定の条件に変更された場合、コントロール内の特定のセルの前色を変更しようとしています。
条件のチェックが開始される前に、コントロールも 1 回描画されます。つまり、すべてのセルが同じ (白の) 前色で塗りつぶされます。
また、このリストボックスはキャンバス内にあり、そのキャンバスはウィンドウ コントロール内にあります。
このコードは、条件とリストボックス内のすべての行をチェックします。
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()
注: 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
- Refresh ではなく、Listbox 全体で無効化します (わからないため)。
- 含まれている 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
行と 3 番目の列全体が異なる色で交互に表示されます。
したがって、最初に表示された後に再描画しようとしているという事実は、問題がある場所にあると思います。