Начальная загрузка DataGridView очень быстрая, последовательные обновления ОЧЕНЬ МЕДЛЕННЫЕ (VB.NET)

#vb.net #performance #datagridview

Вопрос:

Итак, у меня есть форма представления DataGridView, которая изначально загружается сверхбыстро, но при обновлении ее заполнение занимает целую вечность. Вы можете буквально видеть каждую нарисованную линию. Сетка содержит около 1000 строк.

Когда форма загружается, она вызывает функцию refreshPendingsGrid(). Когда пользователь дважды щелкает по любой записи в представлении DataGrid, он снова вызывает ту же функцию refreshPendingsGrid (). Что может привести к обновлению DataGridView в 10 раз медленнее по сравнению с начальной загрузкой?

Спасибо.

 Private Sub frmReviewPendings_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    refreshPendingsGrid()
End Sub


Private Function refreshPendingsGrid()
    DoubleBuffer.DoubleBuffered(dgvPendings, True)
    dgvPendings.Rows.Clear()
    dgvPendings.AllowUserToAddRows = False
    dgvPendings.AllowUserToDeleteRows = False
    dgvPendings.DefaultCellStyle.WrapMode = DataGridViewTriState.True
    dgvPendings.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing

        If RS.EOF And RS.BOF Then
            'there are no rows to add
            If Not (RS Is Nothing) Then RS.Close()
            RS = Nothing
            If Not (DB Is Nothing) Then DB.Close()
            DB = Nothing

            Return 1
        Else
            'loop through all the rows and add them to the table
            RS.MoveFirst()

            dgvPendings.RowCount = RS.RecordCount

            y = 0
            Do Until RS.EOF

                Application.DoEvents()

                dgvPendings.Rows.Item(y).Cells("xxxxxxxx").Value = IIf(IsDBNull(RS.Fields("xxxxxxxx").Value), "", RS.Fields("xxxxxxxx").Value)
                dgvPendings.Rows.Item(y).Cells("xxxxxxxx").Value = IIf(IsDBNull(RS.Fields("xxxxxxxx").Value), "", RS.Fields("xxxxxxxx").Value)
                dgvPendings.Rows.Item(y).Cells("xxxxxxxx").Value = IIf(IsDBNull(RS.Fields("xxxxxxxx").Value), "", RS.Fields("xxxxxxxx").Value)
                dgvPendings.Rows.Item(y).Cells("xxxxxxxx").Value = IIf(IsDBNull(RS.Fields("xxxxxxxx").Value), "", RS.Fields("xxxxxxxx").Value)
                dgvPendings.Rows.Item(y).Cells("xxxxxxxx").Value = IIf(IsDBNull(RS.Fields("xxxxxxxx").Value), "", RS.Fields("xxxxxxxx").Value)

                RS.MoveNext()

                If Not dgvPendings.RowCount = RS.RecordCount Then
                    dgvPendings.RowCount = dgvPendings.RowCount   1
                End If

                y = y   1
            Loop
        End If

End Function


Private Sub dgvPendings_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvPendings.CellDoubleClick
    refreshPendingsGrid()
End Sub
 

Комментарии:

1. Где код, который повторно заполняет сетку?

2. Почему вы вызываете refreshPendingsGrid подпрограмму при каждом двойном щелчке в ячейке?

3. Я добавил код для повторного заполнения. В принципе, он проверяет, есть ли какие-либо данные в наборе данных, и заполняет представление datagrid.

4. @MaciejLos происходит еще больше, я упростил код, просто чтобы сосредоточиться на проблеме.

5. Ответ на вопрос: «почему?» очень важен, потому что я не нашел причин перерисовывать или повторно заполнять весь datagridview. Вам необходимо повторно загрузить только отредактированную в данный момент запись.

Ответ №1:

Проблема решается путем комментирования приложения.События()