Jasonwc Ответов: 1

Как мне ускорить обновление 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

Я могу установить шрифты при создании сетки, но задний цвет ячейки зависит от данных, поэтому мне нужно обновлять его по мере обновления данных.

1 Ответов

Рейтинг:
0

Gerry Schmitz

1) Используйте "источник данных" вместо непосредственного обновления сетки

или

2) Используйте массив текстовых полей / меток (или некоторые другие "легкие веса")

или

3) сведите все "столбцы" (в строке) к одной "строке состояния / строке / тексту"; очевидные элементы не нуждаются в каждом "столбце" (и заголовке).


Jasonwc

Спасибо Джерри я попробую это сделать

Jasonwc

Я попытался использовать таблицы данных, но это не имело никакого значения. Я попробую вместо этого использовать массив меток и посмотрю, поможет ли это.