2010-10-04 75 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秒。

想到我會分享我的經驗。