使用大量数据填充 DataGridView 时性能 VB.NET < - SQL 性能降低

Slow performance in populating DataGridView with large amount of data VB.NET <- SQL

提问人:Milos Dimitrijevic 提问时间:11/14/2023 最后编辑:marc_sMilos Dimitrijevic 更新时间:11/14/2023 访问量:40

问:

我在 WPF VB.NET 项目中填充数据网格时遇到问题。 这是我用于在本地 SQL Server 数据库中调用存储过程的代码:

Public Class SQL
    Private Const ConnectionString As String = "Data Source=(localdb)\TestVFE;Initial Catalog=testVFE;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

    Private Shared Connection As New SqlConnection(ConnectionString)

    Public Shared Sub OpenConnection()
        If Connection.State = ConnectionState.Closed Then
            Connection.Open()
        End If
    End Sub

    Public Shared Sub CloseConnection()
        If Connection.State = ConnectionState.Open Then
            Connection.Close()
        End If
    End Sub

    Public Shared Function GetLast1000Rows() As DataTable
        OpenConnection()
        Dim cmd As New SqlCommand("GetLast1000Rows", Connection)
        cmd.CommandType = CommandType.StoredProcedure
        Dim adapter As New SqlDataAdapter(cmd)
        Dim results As New DataTable()
        adapter.Fill(results)
        CloseConnection()
        Return results
    End Function

这是主窗口:

Class MainWindow

    Private Sub ResultsGrid_Loaded(sender As Object, e As RoutedEventArgs) Handles ResultsGrid.Loaded
        Dim dataTable As DataTable = SQL.GetLast1000Rows
        ResultsGrid.RowHeaderStyle = DataGridViewRowHeadersWidthSizeMode.EnableResizing
        ResultsGrid.ItemsSource = dataTable.DefaultView
    End Sub

End Class

在调试模式下,要从 SQL Server 获取数据,大约需要 500-800 毫秒,但是当执行整个代码时,它需要等待大约 2 分钟才能用 123 列填充 2000 行(表中最大的数据是 4 列 nvarchar 40,其余数据要小得多)。

有人可以帮我改进吗?

WPF vb.net

评论

0赞 jmcilhinney 11/14/2023
当WPF应用程序特定于WinForms时,为什么要在WPF应用程序中使用它?你必须有它才能编译,所以你应该从修复它开始。DataGridViewRowHeadersWidthSizeModeDataGridViewOption Strict Off
0赞 jmcilhinney 11/14/2023
我刚刚注意到你在标题中也提到了。 特定于 WinForns,并且没有属性,因此显然您没有使用属性。据推测,它是一个 WPF 。DataGridViewDataGridViewItemsSourceDataGrid
0赞 F0r3v3r-A-N00b 11/14/2023
您真的需要所有 2000 行和 123 列吗?
0赞 lidqy 11/14/2023
DefaultView 是一个 DataView,它实现了 IBindingListView,由于创建和绑定了许多事件处理程序,它会导致可测量的延迟。也许一个简单的 List<T> 会是一个更好的 ItemsSource。顺便说一句,WPF DataGrid 具有 RowVirtualization 功能。
0赞 lidqy 11/14/2023
ResultsGrid.RowHeaderStyle = DataGridViewRowHeadersWidthSizeMode.EnableResizing没有意义,也不应该编译

答: 暂无答案