代码之家  ›  专栏  ›  技术社区  ›  madlan

慢速DataGridView绘图\呈现

  •  0
  • madlan  · 技术社区  · 14 年前

    我正在使用DataGridView从数据表加载数据。此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
    
    3 回复  |  直到 8 年前
        1
  •  3
  •   madlan    14 年前

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

    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
  •  2
  •   Samskara    8 年前

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

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

    当我的dgv在tabcontrol上时,我想tabcontrols+dgvs可能有问题。

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

    然后我开始检查我在原始DGV上设置的每个属性,每次只更改一个,然后打开表单。DGV立即加载,直到我设置rowheadersWidthSizeMode。它的默认设置是“启用调整大小”,而我原来的慢速DGV已更改为“自动调整大小为所有邮件头”。

    当然,将此设置回默认的“启用大小调整”解决了我的缓慢DGV问题。我可以并排复制。保留dgv@“启用调整大小”,dgv立即加载。将其更改为“autosizetoallheaders”,在加载dgv之前需要1-2秒。

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

    LISIENDS。

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

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

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

    然后我开始检查我在原始DGV上设置的每个属性,每次只更改一个,然后打开表单。DGV立即加载,直到我设置rowheadersWidthSizeMode。它的默认设置是“启用调整大小”,而我原来的慢速DGV已更改为“自动调整大小为所有邮件头”。

    enter image description here

    VS

    enter image description here

    当然,将此设置回默认的“启用大小调整”解决了我的缓慢DGV问题。我可以并排复制。保留dgv@“启用调整大小”,dgv立即加载。将其更改为“autosizetoallheaders”,在加载dgv之前需要1-2秒。

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

        3
  •  0
  •   Mario S    12 年前

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

    焦点->原因验证=真

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

    在窗体设计器中,我将此值设置为

    焦点->原因验证=假

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