缓慢的 DataGridView 绘图\渲染

mad*_*lan 1 vb.net

我正在使用 DataGridView 从 DataTable 加载数据。此 DataGridView 位于选项卡 (Forms.TabPage) 上。单击此选项卡时,无论是否加载数据,数据网格都需要一两秒钟从上到下绘制。

单击选项卡时,我可以做些什么来加速绘图\渲染?

我不认为 DGV 的实际人口会导致这种情况,因为它是在表单加载过程中填充的,因此当单击选项卡时,它会加载它显示的几行 (20 - 30)。

Using cn As New SqlConnection(connectionString)
            Using cmd As SqlCommand = cn.CreateCommand()

                cmd.CommandType = System.Data.CommandType.Text
                cmd.CommandText = _
                    " SELECT [finish_time], [file_name], [transfer_status]" & _
                    " FROM dbo.[transfer_log]"

                cmd.Notification = Nothing

                cn.Open()


                Dim columnSpec = New DataColumn()
                With columnSpec
                    .DataType = GetType(System.String)
                    .ColumnName = "ClmFinishTime"
                End With
                Datatable1.Columns.Add(columnSpec)

                Dim columnSpec2 = New DataColumn()
                With columnSpec2
                    .DataType = GetType(System.String)
                    .ColumnName = "ClmFilename"
                End With
                Datatable1.Columns.Add(columnSpec2)

                Dim columnSpec3 = New DataColumn()
                With columnSpec3
                    .DataType = GetType(System.Byte())
                    .ColumnName = "ClmStatus"
                End With
                Datatable1.Columns.Add(columnSpec3)

                Using dr As SqlDataReader = cmd.ExecuteReader()
                    While dr.Read()

                        Dim row As DataRow = Datatable1.NewRow
                        row("ClmFinishTime") = dr.Item("finish_time")
                        row("ClmFilename") = dr.Item("file_name")

                        Select Case dr.Item("transfer_status")
                            Case 0
                                row("ClmStatus") = ConvertToByte(My.Resources.accept)
                            Case 1
                                row("ClmStatus") = ConvertToByte(My.Resources.remove)
                        End Select

                        Datatable1.Rows.Add(row)

                    End While
                End Using
        End Using
                DataGridView2.AutoGenerateColumns = False
                DataGridView2.DataSource = Datatable1
Run Code Online (Sandbox Code Playgroud)

mad*_*lan 7

我通过双重缓冲控件解决了这个问题:

Public Shared Sub SetDoubleBuffered(ByVal control As Control)
    GetType(Control).InvokeMember("DoubleBuffered", BindingFlags.SetProperty Or BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, control, New Object() {True})
End Sub
Run Code Online (Sandbox Code Playgroud)