Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net datagridview中的单元格闪烁和可选行颜色_Vb.net_Winforms_Datagridview - Fatal编程技术网

Vb.net datagridview中的单元格闪烁和可选行颜色

Vb.net datagridview中的单元格闪烁和可选行颜色,vb.net,winforms,datagridview,Vb.net,Winforms,Datagridview,如上文所述。我正在寻找建议,以提高我的程序性能。该程序以不同的颜色显示大量数据,供用户监控整个系统信息。有20多个主要的增强版本。最近,我收到了在现有程序中添加“单元格闪烁”的要求。添加“单元闪烁”功能后,CPU处理从0~4%上升到18~21% 用于数据检索。它由多个数据网格视图组成。 dgv1“详细信息”数据源更改后,dgv2将有选择地显示dgv1列,称为“摘要”,并设置其数据源 Private Sub dgv1_DataSourceChanged(sender As Object,

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

用于数据检索。它由多个数据网格视图组成。 dgv1“详细信息”数据源更改后,dgv2将有选择地显示dgv1列,称为“摘要”,并设置其数据源

    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_细胞格式化功能。每0.5秒,它将一次又一次地触发该功能

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

我已经检查过,在默认情况下,只要有来自的单元格绘制,就会触发该事件


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

既然您的颜色是根据数据设置的,为什么不简单地使用例程来设置更改数据的颜色,而不是通过CellFormatting事件?这样,闪烁不会导致重新计算所有颜色。通过这种方式,您可以在加载表时设置颜色,然后仅在数据更改时重新设置。我同意@JonathanWillcock-
CellFormatting
是事件的资源占用者,因此我强烈建议仅在数据更改时才将行着色逻辑移动到。@JonathanWillcock我为dgv2替换了单元格格式事件,用细胞染色代替。它减少了CPU时间。谢谢你的建议。@jaredbaszler是的,当单元格格式化事件不用于绘制单元格时,它减少了CPU时间。我需要注意的唯一一件事是在数据发生变化时重新设置颜色。既然您的颜色是根据数据设置的,为什么不简单地使用一个例程来设置变化数据的颜色,而不是通过CellFormatting事件?这样,闪烁不会导致重新计算所有颜色。通过这种方式,您可以在加载表时设置颜色,然后仅在数据更改时重新设置。我同意@JonathanWillcock-
CellFormatting
是事件的资源占用者,因此我强烈建议仅在数据更改时才将行着色逻辑移动到。@JonathanWillcock我为dgv2替换了单元格格式事件,用细胞染色代替。它减少了CPU时间。谢谢你的建议。@jaredbaszler是的,当单元格格式化事件不用于绘制单元格时,它减少了CPU时间。我唯一需要注意的是,每当数据发生变化时,重新设置颜色。