2010-10-04 67 views
0

我正在使用DataGridView从DataTable加载数据。此DataGridView位于选项卡(Forms.TabPage)上。当点击这个标签时,无论数据是否被加载,数据网格都需要一两秒钟的时间从上到下进行绘制。Slow DataGridView绘图渲染

有什么我可以做的,以加快单击Tab时的绘图\渲染?

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

如果我注释掉“DataGridView2.DataSource = Datatable1”,它很好(即时),所以它必须是由于我构建数据源以添加图标来代替返回的列ClmStatus。有什么建议么? – madlan 2010-10-06 20:57:37

回答

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 
0

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

焦点 - >的CausesValidation =真

由于这个原因,它占用了10分钟从大的DataTable填充的DataGridView。

在窗体设计器,我这个值设置为

焦点 - >的CausesValidation =假

我的DataGridView现在正常工作,它重绘在第二或更小,它的数据源链接到DataTable包含2,000行和100列,一些单元格保存最多32,767个字符的文本。它对用户编辑单元格等的响应没有明显的延迟。

2

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

我尝试了各种'doublebuffer'技术,无济于事。

在TabControl上使用我的DGV时,我以为TabControls + DGV可能存在问题。

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

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

enter image description here

enter image description here

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

想到我会分享我的经验。