【发布时间】:2019-01-21 19:04:45
【问题描述】:
我有一个程序,它会使用通过 TCP 接收的新数据定期更新一些数据网格视图。我遇到的问题是屏幕刷新很慢。 Bellow 是我的代码的精简版。此示例每次迭代 StartButton_Click 中的循环需要 1.1 秒来更新屏幕。如何在不减少显示的数据量的情况下加快速度?
我添加了一个秒表来尝试找出导致最大问题的代码行。从测试来看,主要问题似乎是用新数字更新 datagridview 单元格。
我不确定如何加快速度,因为我的程序依赖于定期更新的值。 datagridview 不是此应用程序的正确对象吗?我应该使用别的东西吗?有没有办法让 datagridview 更新得更快?
公开课表1
Public DataTable1 As New DataTable
Private Sub Load_From(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.DataSource = DataTable1
Me.Height = 700
Me.Width = 1000
DataGridView1.Location = New Point(10, 10)
DataGridView1.Width = Me.Width - 10
DataGridView1.Height = Me.Height - 10
For c As Integer = 0 To 20
DataTable1.Columns.Add("col" & c)
If DataTable1.Rows.Count = 0 Then
DataTable1.Rows.Add()
End If
DataGridView1.Columns(c).AutoSizeMode = DataGridViewAutoSizeColumnMode.None '0%
DataTable1.Rows(0).Item(c) = "col" & c
DataGridView1.Columns(c).Width = 40
'Header
DataGridView1.Rows(0).Cells(c).Style.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridView1.Rows(0).Cells(c).Style.WrapMode = DataGridViewTriState.True
DataGridView1.Rows(0).Cells(c).Style.Font = New Font("Verdana", 8, FontStyle.Bold)
'Data
DataGridView1.Columns(c).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
DataGridView1.Columns(c).DefaultCellStyle.WrapMode = DataGridViewTriState.False
DataGridView1.Columns(c).DefaultCellStyle.Font = New Font("Verdana", 8, FontStyle.Regular)
Next
For r As Integer = 1 To 25
DataTable1.Rows.Add()
Next
End Sub
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
Dim stpw As New Stopwatch
stpw.Reset()
stpw.Start()
For i As Integer = 0 To 10
Dim rand As New Random
Dim randnumber As Double = rand.Next(5, 15) / 10
UpdateDataTable(randnumber)
DataGridView1.Update()
Me.Text = i & "/100"
Next
stpw.Stop()
MsgBox(stpw.Elapsed.TotalMilliseconds)
End Sub
Private Sub UpdateDataTable(ByVal offset As Double)
For r As Integer = 1 To DataTable1.Rows.Count - 1 'loop through rows
For c As Integer = 0 To DataTable1.Columns.Count - 1 '89%
DataTable1.Rows(r).Item(c) = (r / c) * offset
Next
Next
End Sub
结束类
【问题讨论】:
-
从循环中删除
DataGridView1.Update()和Me.Text = i & "/100"调用是一个好的开始。没有理由强制 DGV 手动重绘(更新)自身,尤其不是在每次迭代时。而设置表单的文本只需要更多不必要的更新。 -
my program relies on the values being updated regularly你应该发布一些展示真实应用而不是人工测试的内容。 -
Thaks Visual Vincent 和 Plutonix 我试图通过仅显示导致问题的代码来简化它。完整的应用程序大约有 100,000 行代码。我用随机数生成器替换了值的生成方式。使用秒表,我发现更新数据网格中的值会花费时间。测定值小于1%
标签: vb.net performance datagridview datatable refresh