Как мне ускорить обновление datagridview
Всем Привет
У меня есть программа, которая регулярно обновляет несколько представлений сетки данных новыми данными, полученными через TCP. Проблема, с которой я сталкиваюсь, заключается в том, что обновление экрана происходит довольно медленно. Беллоу-это урезанная версия моего кода. Этот пример занимает 1,1 секунды, чтобы обновить экран каждый раз, когда цикл в StartButton_Click повторяется. Как я могу сделать это быстрее, не изменяя количество отображаемых данных?
Public Class Form1 Private Sub Load_From(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Height = 700 Me.Width = 1000 DataGridView1.Location = New Point(10, 10) DataGridView1.Width = Me.Width - 10 DataGridView1.Height = Me.Height - 10 DataGridView1.Rows.Clear() DataGridView1.Columns.Clear() 'Set backcolour DataGridView1.BackColor = Color.Black DataGridView1.BackgroundColor = Color.Black DataGridView1.DefaultCellStyle.BackColor = Color.Black DataGridView1.DefaultCellStyle.SelectionBackColor = Color.Black 'Set forecolour DataGridView1.ForeColor = Color.White DataGridView1.DefaultCellStyle.ForeColor = Color.White DataGridView1.DefaultCellStyle.SelectionForeColor = Color.White For c As Integer = 0 To 20 DataGridView1.Columns.Add(New DataGridViewTextBoxColumn) If DataGridView1.RowCount = 0 Then DataGridView1.Rows.Add() ' ''LeaderBoardTable.Rows(0).Frozen = True End If DataGridView1.Columns(c).AutoSizeMode = DataGridViewAutoSizeColumnMode.None '0% DataGridView1.Columns(c).Name = "col" & c DataGridView1.Rows(0).Cells(c).Value = "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 DataGridView1.Rows.Add(25) 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 UpdateDataGridView(randnumber) DataGridView1.Update() Me.Text = i & "/100" Next stpw.Stop() MsgBox(stpw.Elapsed.TotalMilliseconds) End Sub Private Sub UpdateDataGridView(ByVal offset As Double) For r As Integer = 1 To DataGridView1.RowCount - 1 'loop through rows 'Reset row For c As Integer = 0 To DataGridView1.ColumnCount - 1 '10% 'Set Cell to default colour DataGridView1(c, r).Style.BackColor = Color.Black '4% DataGridView1(c, r).Style.ForeColor = Color.White '1% DataGridView1(c, r).Style.Font = New Font("Verdana", 8, FontStyle.Regular) '0% DataGridView1(c, r).Value = "" '0% Next 'Set New Data For c As Integer = 0 To DataGridView1.ColumnCount - 1 '89% Dim colname As String = DataGridView1.Columns(c).Name '0% DataGridView1.Rows(r).Cells(colname).Value = (r / c) * offset 'Round Off 0% If DataGridView1.Rows(r).Cells(colname).Value > 1 Then '5% DataGridView1.Rows(r).Cells(colname).Style.BackColor = Color.Red End If Next Next End Sub End Class
Что я уже пробовал:
Я добавил секундомер, чтобы попытаться выяснить, какие строки кода вызывают самую большую проблему. Результатом этих тестов являются значения % в комментариях после каждой строки кода. Значение % - это выигрыш, когда эта строка кода была закомментирована.
Судя по тестам, главной проблемой было обновление ячеек datagridview новым номером или цветом. Все остальные строки кода имели очень мало значения.
Я не знаю, как сделать это быстрее, так как моя программа полагается на то, что значения и цвета регулярно обновляются. Является ли datagridview не подходящим объектом для этого приложения? Должен ли я использовать что-то еще? Есть ли способ, чтобы получить datagridview, чтобы обновления быстрее?
Richard MacCutchan
Скорее всего, потому, что вы каждый раз обновляете свойства своей сетки. Вы должны установить форматы (цвета, стили шрифтов и т.д.) При создании сетки. Обновление должно просто добавить или изменить содержимое.
Jasonwc
Я могу установить шрифты при создании сетки, но задний цвет ячейки зависит от данных, поэтому мне нужно обновлять его по мере обновления данных.