Vb.net 慢速DataGridView绘图\渲染

Vb.net 慢速DataGridView绘图\渲染,vb.net,Vb.net,我使用DataGridView从DataTable加载数据。此DataGridView位于选项卡Forms.TabPage上。单击此选项卡时,无论是否加载数据,datagrid都需要一两秒钟的时间从上到下绘制 单击选项卡时,我可以做些什么来加速绘图\渲染 我不认为DGV的实际数量是造成这种情况的原因,因为它是在表单加载期间填充的,所以当选项卡单击时,它将加载显示的20-30行 Using cn As New SqlConnection(connectionString)

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

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

我不认为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

我通过双重缓冲控件修复了此问题:

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

我通过双重缓冲控件修复了此问题:

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

由于将DataGridView对象放入TableLayoutPanel,我遇到了类似的问题。Visual Studio中TableLayoutPanel的默认行为具有以下属性:

焦点->原因验证=真

因此,从大型DataTable填充DataGridView最多需要10分钟

在表单设计器中,我将此值设置为

焦点->原因验证=错误


我的DataGridView现在工作正常,它在一秒钟或更短的时间内重新绘制,其数据源链接到一个包含2000行和100列的DataTable,其中一些单元格包含最多32767个字符的文本。它对用户编辑单元格等的响应没有明显的延迟

由于将DataGridView对象放入TableLayoutPanel,我遇到了类似的问题。Visual Studio中TableLayoutPanel的默认行为具有以下属性:

焦点->原因验证=真

因此,从大型DataTable填充DataGridView最多需要10分钟

在表单设计器中,我将此值设置为

焦点->原因验证=错误


我的DataGridView现在工作正常,它在一秒钟或更短的时间内重新绘制,其数据源链接到一个包含2000行和100列的DataTable,其中一些单元格包含最多32767个字符的文本。它对用户编辑单元格等的响应没有明显的延迟

这是我的两分钱。我的DGV速度非常慢,即使只有100条记录。运行查询不是问题所在-它以毫秒为单位返回结果

我尝试了各种“双缓冲”技术,但都没有成功

当我的DGV在TabControl上时,我想TabControls+DGV可能有问题

为了解决这个问题,我创建了一个新表单,添加了一个DGV,并让它在表单加载事件中填充DGV。我很高兴看到数据立即加载

然后我开始检查我在原始DGV上设置的每个属性,每次只更改一个属性,然后打开表单。DGV立即加载,直到我设置RowHeadersWidthSizeMode。此操作的默认设置为“启用大小调整”,而我原来的慢速DGV已更改为“AutoSizeToAllHeaders”

vs

果不其然,将其设置回默认值“EnableResizing”解决了我的DGV速度慢的问题。我能把这个并排复制出来。离开DGV@“启用调整大小”,DGV将立即加载。将其更改为“AutoSizeToAllHeaders”,DGV加载前需要1-2秒


我只是想和大家分享一下我的经验。

我的两分钱。我的DGV速度非常慢,即使只有100条记录。运行查询不是问题所在-它以毫秒为单位返回结果

我尝试了各种“双缓冲”技术,但都没有成功

当我的DGV在TabControl上时,我想TabControls+DGV可能有问题

为了解决这个问题,我创建了一个新表单,添加了一个DGV,并让它在表单加载事件中填充DGV。我很高兴看到数据立即加载

然后我开始检查我在原始DGV上设置的每个属性,每次只更改一个属性,然后打开表单。DGV立即加载,直到我设置RowHeadersWidthSizeMode。此操作的默认设置为“启用大小调整”,而我原来的慢速DGV已更改为“AutoSizeToAllHeaders”

vs

果不其然,将其设置回默认值“EnableResizing”解决了我的DGV速度慢的问题。我能把这个并排复制出来。离开DGV@“启用调整大小”,DGV将立即加载。将其更改为“AutoSizeToAllHeaders”,DGV加载前需要1-2秒


我想与大家分享一下我的经验。

或者@madlan通过继承控件在构造函数中设置DoubleBuffered属性

public class DoubleBufferedDataGridView : DataGridView
{
    public DoubleBufferedDataGridView() : base()
    {
        this.DoubleBuffered = true;
    }
}

或者@madlan只需通过继承控件在构造函数中设置DoubleBuffered属性

public class DoubleBufferedDataGridView : DataGridView
{
    public DoubleBufferedDataGridView() : base()
    {
        this.DoubleBuffered = true;
    }
}

如果我注释掉DataGridView2.DataSource=Datatable1,这是一个很好的瞬间,因此这一定是由于我构建数据源的方式,以添加图标来代替返回的列ClmStatus。有什么建议吗?如果我把DataGridView2.DataSource=Datatable1注释掉,这很好,所以一定是因为我的构建方式 向上调整数据源以添加图标来代替返回的列ClmStatus。有什么建议吗?