1

デスクトップアプリケーションで作業していて、おそらくばかげた問題を抱えていて、まだ私を怒らせています。

動的ソースから行を取得するリストボックスがあります。

そのセルの基になるデータが特定の条件に変更された場合、コントロール内の特定のセルの前色を変更しようとしています。

条件のチェックが開始される前に、コントロールも 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 番目の列全体が異なる色で交互に表示されます。

したがって、最初に表示された後に再描画しようとしているという事実は、問題がある場所にあると思います。

4

1 に答える 1