#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:
Проблема решается путем комментирования приложения.События()