【问题标题】:Slow DataGridView Drawing\Rendering缓慢的 DataGridView 绘图\渲染
【发布时间】:2010-10-04 22:02:12
【问题描述】:

我正在使用 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

【问题讨论】:

  • 如果我注释掉“DataGridView2.DataSource = Datatable1”,这很好(即时),所以这一定是由于我构建数据源以添加图标代替返回的列 ClmStatus .有什么建议吗?

标签: vb.net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    对比

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

    只是想我会分享我的经验。

    【讨论】:

      【解决方案3】:

      除了@madlan,只需通过继承控件在构造函数中设置 DoubleBuffered 属性。

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

      【讨论】:

        【解决方案4】:

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

        焦点 -> CausesValidation = True

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

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

        焦点 -> CausesValidation = False

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

        【讨论】:

          猜你喜欢
          • 2020-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-06
          • 2013-11-25
          • 2018-01-22
          • 1970-01-01
          • 2022-01-25
          相关资源
          最近更新 更多