数据网格视图中的单元格闪烁和备用行颜色

时间:2017-07-29 09:42:17

标签: vb.net winforms datagridview

如上所述。我正在寻找提高程序性能的建议。该程序显示大量不同颜色的数据,供用户监控整个系统信息。有超过20个主要增强版本。最近我收到了在现有程序中添加“单元闪烁”的要求。添加“单元闪烁”功能后,CPU处理从0~4%上升到18~21%。

用于数据检索。它包含多个数据网格视图。 在dgv1“detail”数据源发生更改后,dgv2将有选择地显示dgv1列,称为“summary”并设置其数据源。

    Private Sub dgv1_DataSourceChanged(sender As Object, e As EventArgs) Handles dgv1.DataSourceChanged

    ' Get data source from dgv1
    Dim dt1 As DataTable = dgvDetail.DataSource

    ' Select few columns from there     
    Dim selectedColumns As String() = New String() { ..... }
    Dim dt2 As DataTable = New DataView(dt1, String.Empty, String.Empty, DataViewRowState.CurrentRows).ToTable(False, selectedColumns)

    ' Set dt2 back to dgv2
    dgv2.DataSource = dt2
End Sub

为了在数据网格上显示不同的颜色,基于单元格值以及dgv2中的交替行颜色。我正在使用CellFormatting事件来执行此操作。下面的编码已经简化了很多。这段代码在我的程序中也完全没问题。

    Private Sub dgv2_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv2.CellFormatting

    ' Alternating rows color if previous row cell is different values 
    ' When current machineNo is different that previous row, then chg color
    ..... 

    ' Set colors based on values..
    ......
    ' Set colors based on values..

    ' Set colors based on values..

    ' Set colors based on values..

End Sub

最后,是时候在单元格值上添加单元格闪烁功能了。我已经创建了一个后台工作者来做魔术,添加到我的表单加载来触发这个线程。所以每0.5秒,单元格(3)(4)将闪烁不同的颜色!

    Dim _OnlyTwoColorChoices As Boolean 'for blinking purpose on TV screen

Private Sub backgroundWorker_DoWork(sender As Object, e As DoWorkEventArgs) Handles backgroundWorker.DoWork
    While True
        If dgv2.IsDisposed Then
            Return
        Else
            If _cellList.Count > 0 Then
                If _OnlyTwoColorChoices = True Then
                    dgv2.Rows(3).Cells(14).Style.BackColor = Color.Pink
                Else
                    dgv2.Rows(3).Cells(14).Style.BackColor = Color.Yellow
                End If

                ' Set to different value so that next flash will get different color
                _OnlyTwoColorChoices = Not _OnlyTwoColorChoices
            End If

            ' Blink frequency
            Thread.Sleep(500)
        End If
    End While
End Sub

但后来我遇到了这个性能问题。它占用了太多的CPU时间。最初我怀疑它是细胞闪烁功能。但它只有几条简单的线条。我在VS2015中使用诊断工具,以0.5秒的间隔找出每个尖峰的根本原因。它真的是后台工作者的错吗?答案是不。罪魁祸首是dgv2_CellFormatting函数。每0.5秒,它会一次又一次地触发该功能。

  

每次绘制每个单元格时都会发生CellFormatting事件

我已经检查过,只要有来自MS DataGridView CellFormating

的单元格绘制,就会触发默认情况下的事件

我的问题是如何同时使用CellFormatting和CellBlink(后台工作者)并且没有性能问题?请注意:我没有使用后台工作器,而是使用Timer来实现单元闪烁,性能也不是更好。

0 个答案:

没有答案