2010-10-04 6 views
0

J'utilise un DataGridView pour charger des données à partir d'un DataTable. Cette DataGridView se trouve sur un onglet (Forms.TabPage). Lorsque vous cliquez sur cet onglet, le DataGrid prend une seconde ou deux à tirer de haut en bas, indépendamment du fait que les données sont chargées ou non.Dessin/Rendu DataGridView Lent

Y a-t-il quelque chose que je puisse faire pour accélérer le dessin \ rendu lorsque je clique sur l'onglet?

Je ne pense pas que la population réelle de la DGV en soit la cause, car elle est remplie lors du chargement du formulaire, de sorte qu'au moment où les onglets cliquaient, les quelques rangées (20 à 30) s'affichaient.

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

Si je commente "DataGridView2.DataSource = Datatable1" c'est bien (instantané) donc cela doit être dû à la façon dont je construis la source de données pour ajouter les icônes à la place de la colonne retournée ClmStatus. Aucune suggestion? – madlan

Répondre

3

Je fixe ce double tampon le contrôle:

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

J'ai eu un problème similaire en raison de placer l'objet dans un DataGridView TableLayoutPanel. Le comportement par défaut dans Visual Studio d'un TableLayoutPanel a la propriété suivante:

Focus -> CausesValidation = True

En raison de cela, il fallait jusqu'à 10 minutes pour remplir le DataGridView d'un grand DataTable.

Dans le Concepteur de formulaires, je mis cette valeur à

Focus -> CausesValidation = False

Mon DataGridView fonctionne correctement, il redessine dans une seconde ou moins, et sa source de données est liée à une DataTable contenant 2 000 lignes et 100 colonnes, certaines cellules contenant du texte jusqu'à 32 767 caractères. Sa réponse aux cellules d'édition de l'utilisateur, etc. n'a aucun retard apparent.

2

Mes deux cents à ce sujet. J'avais un DGV extrêmement lent, même avec seulement 100 enregistrements. L'exécution de la requête n'était pas le problème: elle renvoyait les résultats en millisecondes.

J'ai essayé les différentes techniques 'doublebuffer', en vain.

Avec mon DGV sur un TabControl, je pensais qu'il y avait peut-être un problème avec TabControls + DGV. Pour résoudre ce problème, j'ai créé un nouveau formulaire, ajouté une DGV et l'a fait remplir la DGV sur l'événement de chargement de formulaire. J'étais content de voir les données chargées instantanément.

J'ai ensuite commencé à parcourir chaque propriété que j'avais définie sur mon DGV d'origine, en changeant seulement une à la fois, puis en ouvrant le formulaire. Le DGV chargé instantanément, jusqu'à ce que je définis le RowHeadersWidthSizeMode. Le paramètre par défaut pour ceci est 'EnableResizing', alors que mon original DGV lent a été changé en 'AutoSizeToAllHeaders'.

enter image description here

contre

enter image description here

Effectivement, ce réglage aux paramètres par défaut de 'EnableResizing' résolu mon problème lent DGV. Je suis capable de reproduire cela côte à côte. Laissez le DGV @ 'EnableResizing', DGV charge instantanément. Changez-le en 'AutoSizeToAllHeaders' et cela prend 1-2 secondes avant le chargement de la DGV.

Juste pensé que je partagerais mon expérience avec ceci.