Vb.net datagridview中的单元格闪烁和可选行颜色
如上文所述。我正在寻找建议,以提高我的程序性能。该程序以不同的颜色显示大量数据,供用户监控整个系统信息。有20多个主要的增强版本。最近,我收到了在现有程序中添加“单元格闪烁”的要求。添加“单元闪烁”功能后,CPU处理从0~4%上升到18~21% 用于数据检索。它由多个数据网格视图组成。 dgv1“详细信息”数据源更改后,dgv2将有选择地显示dgv1列,称为“摘要”,并设置其数据源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,
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时间。我唯一需要注意的是,每当数据发生变化时,重新设置颜色。