慢速DataGridView绘图\渲染

时间:2010-10-04 22:02:12

标签: vb.net

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

单击选项卡时,有什么办法可以加快Drawing \ Rendering的速度吗?

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

我尝试了各种“双缓冲”技术,但无济于事。

将我的DGV放在TabControl上,我认为TabControls + DGV可能存在问题。

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

然后我开始浏览我在原始DGV上设置的每个属性,一次只更改一个,然后打开表单。 DGV立即加载,直到我设置RowHeadersWidthSizeMode。默认设置为“EnableResizing”,而我原来的慢速DGV已更改为“AutoSizeToAllHeaders”。

enter image description here

VS

enter image description here

果然,将其设置回默认值“EnableResizing”解决了我的慢速DGV问题。我能够并排重现这一点。离开DGV @'EnableResizing',DGV立即加载。将其更改为“AutoSizeToAllHeaders”,DGV加载前需要1-2秒。

我以为我会分享我的经验。

答案 2 :(得分:1)

对于@madlan,只需继承控件即可在构造函数中设置DoubleBuffered属性。

Storage:
      Class:  gp2
      Type:   jbod
      Volumes:
        Delete Claim:  false
        Id:            0
        Size:          300Gi
        Type:          persistent-claim
        Delete Claim:  false
        Id:            1
        Size:          300Gi
        Type:          persistent-claim

答案 3 :(得分:0)

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

焦点 - > CausesValidation = True

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

在Forms Designer中,我将此值设置为

焦点 - > CausesValidation = False

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