Meilleures pratiques pour la mise à l'échelle du contrôle DataGridView Windows Forms

Le DataGridView contrôle est conçu pour fournir une scalabilité maximale. Si vous avez besoin d’afficher de grandes quantités de données, vous devez suivre les instructions décrites dans cette rubrique pour éviter de consommer de grandes quantités de mémoire ou de dégrader la réactivité de l’interface utilisateur (IU). Cette rubrique traite des problèmes suivants :

  • Utilisation efficace des styles de cellule

  • Utilisation efficace des menus contextuels

  • Utilisation efficace du redimensionnement automatique

  • Utilisation efficace des collections de cellules, de lignes et de colonnes sélectionnées

  • Utilisation de lignes partagées

  • Empêcher les lignes de devenir non partagés

Si vous avez des besoins spéciaux en matière de performances, vous pouvez implémenter le mode virtuel et fournir vos propres opérations de gestion des données. Pour plus d’informations, consultez Les modes d’affichage des données dans le contrôle DataGridView Windows Forms.

Utilisation efficace des styles de cellule

Chaque cellule, ligne et colonne peut avoir ses propres informations de style. Les informations de style sont stockées dans des DataGridViewCellStyle objets. La création d’objets de style de cellule pour de nombreux éléments individuels DataGridView peut être inefficace, en particulier lors de l’utilisation de grandes quantités de données. Pour éviter un impact sur les performances, utilisez les instructions suivantes :

Utilisation efficace des menus contextuels

Chaque cellule, ligne et colonne peut avoir son propre menu contextuel. Les menus contextuels du DataGridView contrôle sont représentés par ContextMenuStrip les contrôles. Tout comme avec les objets de style de cellule, la création de menus contextuels pour de nombreux éléments individuels DataGridView aura un impact négatif sur les performances. Pour éviter cette pénalité, utilisez les instructions suivantes :

  • Évitez de créer des menus contextuels pour des cellules et des lignes individuelles. Cela inclut le modèle de ligne, cloné avec son menu contextuel lorsque de nouvelles lignes sont ajoutées au contrôle. Pour une scalabilité maximale, utilisez uniquement la propriété du ContextMenuStrip contrôle pour spécifier un menu contextuel unique pour l’ensemble du contrôle.

  • Si vous avez besoin de plusieurs menus contextuels pour plusieurs lignes ou cellules, gérez les événements ou RowContextMenuStripNeeded les CellContextMenuStripNeeded événements. Ces événements vous permettent de gérer vous-même les objets de menu contextuel, ce qui vous permet d’optimiser les performances.

Utilisation efficace du redimensionnement automatique

Les lignes, les colonnes et les en-têtes peuvent être redimensionnés automatiquement en tant que modifications de contenu de cellule afin que l’ensemble du contenu des cellules soit affiché sans découpage. La modification des modes de dimensionnement peut également redimensionner des lignes, des colonnes et des en-têtes. Pour déterminer la taille correcte, le DataGridView contrôle doit examiner la valeur de chaque cellule qu’il doit prendre en charge. Lorsque vous utilisez des jeux de données volumineux, cette analyse peut avoir un impact négatif sur les performances du contrôle lorsque le redimensionnement automatique se produit. Pour éviter les pénalités de performances, suivez les instructions suivantes :

Pour plus d’informations, consultez Options de dimensionnement dans le contrôle DataGridView Windows Forms.

Utilisation efficace des collections cellules, lignes et colonnes sélectionnées

La SelectedCells collection ne fonctionne pas efficacement avec de grandes sélections. Les collections et SelectedColumns les SelectedRows collections peuvent également être inefficaces, bien qu’à un moindre degré, car il y a beaucoup moins de lignes que de cellules dans un contrôle classiqueDataGridView, et beaucoup moins de colonnes que de lignes. Pour éviter les pénalités de performances lors de l’utilisation de ces regroupements, suivez les instructions suivantes :

Utilisation de lignes partagées

Une utilisation efficace de la mémoire est obtenue dans le contrôle par le DataGridView biais de lignes partagées. Les lignes partageront autant d’informations sur leur apparence et leur comportement que possible en partageant des instances de la DataGridViewRow classe.

Bien que le partage d’instances de lignes enregistre la mémoire, les lignes peuvent facilement devenir non partagée. Par exemple, chaque fois qu’un utilisateur interagit directement avec une cellule, sa ligne devient non partagé. Comme cela ne peut pas être évité, les instructions de cette rubrique sont utiles uniquement lorsque vous travaillez avec de très grandes quantités de données et uniquement lorsque les utilisateurs interagissent avec une partie relativement petite des données chaque fois que votre programme est exécuté.

Une ligne ne peut pas être partagée dans un contrôle indépendant DataGridView si l’une de ses cellules contient des valeurs. Lorsque le DataGridView contrôle est lié à une source de données externe ou lorsque vous implémentez le mode virtuel et fournissez votre propre source de données, les valeurs de cellule sont stockées en dehors du contrôle plutôt que dans les objets de cellule, ce qui permet de partager les lignes.

Un objet de ligne ne peut être partagé que si l’état de toutes ses cellules peut être déterminé à partir de l’état de la ligne et des états des colonnes contenant les cellules. Si vous modifiez l’état d’une cellule afin qu’elle ne puisse plus être déduite de l’état de sa ligne et de sa colonne, la ligne ne peut pas être partagée.

Par exemple, une ligne ne peut pas être partagée dans l’une des situations suivantes :

En mode lié ou en mode virtuel, vous pouvez fournir des outils Astuces et des menus contextuels pour des cellules individuelles en gérant les événements et CellContextMenuStripNeeded les CellToolTipTextNeeded événements.

Le DataGridView contrôle tente automatiquement d’utiliser des lignes partagées chaque fois que les lignes sont ajoutées au DataGridViewRowCollection. Utilisez les instructions suivantes pour vous assurer que les lignes sont partagées :

  • Évitez d’appeler la Add(Object[]) surcharge de la Add méthode et la Insert(Object[]) surcharge de la Insert méthode de la DataGridView.Rows collection. Ces surcharges créent automatiquement des lignes non partagés.

  • Vérifiez que la ligne spécifiée dans la DataGridView.RowTemplate propriété peut être partagée dans les cas suivants :

  • Assurez-vous que la ligne indiquée par le paramètre peut être partagée lors de DataGridView.Rows l’appel indexSource de la AddCopycollection , AddCopieset InsertCopyInsertCopies des méthodes.

  • Assurez-vous que la ligne ou les lignes spécifiées peuvent être partagées lors de l’appel de la Add(DataGridViewRow) surcharge de la Add méthode, de AddRange la méthode, Insert(Int32,DataGridViewRow) de la surcharge de la Insert méthode et de la InsertRange méthode de la DataGridView.Rows collection.

Pour déterminer si une ligne est partagée, utilisez la DataGridViewRowCollection.SharedRow méthode pour récupérer l’objet de ligne, puis case activée la propriété de l’objetIndex. Les lignes partagées ont toujours une Index valeur de propriété de –1.

Empêcher les lignes de devenir non partagés

Les lignes partagées peuvent devenir non partagées suite à l’action du code ou de l’utilisateur. Pour éviter un impact sur les performances, vous devez éviter de provoquer le partage des lignes. Pendant le développement d’applications, vous pouvez gérer l’événement RowUnshared pour déterminer quand les lignes deviennent non partagés. Cela est utile lors du débogage des problèmes de partage de lignes.

Pour empêcher les lignes de devenir non partagés, utilisez les instructions suivantes :

  • Évitez d’indexer la Rows collection ou d’effectuer une itération avec une foreach boucle. Vous n’aurez généralement pas besoin d’accéder directement aux lignes. DataGridView les méthodes qui fonctionnent sur les lignes prennent des arguments d’index de ligne plutôt que des instances de ligne. En outre, les gestionnaires pour les événements liés aux lignes reçoivent des objets d’argument d’événement avec des propriétés de ligne que vous pouvez utiliser pour manipuler des lignes sans les entraîner à devenir non partagés.

  • Si vous devez accéder à un objet de ligne, utilisez la DataGridViewRowCollection.SharedRow méthode et passez l’index réel de la ligne. Notez toutefois que la modification d’un objet de ligne partagé récupéré via cette méthode modifie toutes les lignes qui partagent cet objet. La ligne des nouveaux enregistrements n’est pas partagée avec d’autres lignes. Toutefois, elle n’est donc pas affectée lorsque vous modifiez une autre ligne. Notez également que différentes lignes représentées par une ligne partagée peuvent avoir différents menus contextuels. Pour récupérer le menu contextuel approprié à partir d’une instance de ligne partagée, utilisez la GetContextMenuStrip méthode et passez l’index réel de la ligne. Si vous accédez à la propriété de ContextMenuStrip la ligne partagée à la place, elle utilise l’index de ligne partagée de -1 et ne récupère pas le menu contextuel approprié.

  • Évitez d’indexer la DataGridViewRow.Cells collection. L’accès direct à une cellule entraîne l’instanciation d’une nouvelle DataGridViewRowligne parente. Les gestionnaires pour les événements liés aux cellules reçoivent des objets d’argument d’événement avec des propriétés de cellule que vous pouvez utiliser pour manipuler des cellules sans provoquer le partage de lignes. Vous pouvez également utiliser la CurrentCellAddress propriété pour récupérer les index de ligne et de colonne de la cellule active sans accéder directement à la cellule.

  • Évitez les modes de sélection basés sur les cellules. Ces modes entraînent l’annulation du partage des lignes. Au lieu de cela, définissez la DataGridView.SelectionMode propriété sur DataGridViewSelectionMode.FullRowSelect ou DataGridViewSelectionMode.FullColumnSelect.

  • Ne gérez pas les événements ou DataGridView.RowStateChanged les DataGridViewRowCollection.CollectionChanged événements. Ces événements entraînent l’annulation du partage des lignes. En outre, n’appelez pas les DataGridViewRowCollection.OnCollectionChanged méthodes ou DataGridView.OnRowStateChanged les méthodes qui déclenchent ces événements.

  • N’accédez pas à la DataGridView.SelectedCells collection lorsque la DataGridView.SelectionMode valeur de propriété est FullColumnSelect, ColumnHeaderSelectou FullRowSelectRowHeaderSelect. Cela entraîne l’annulation du partage de toutes les lignes sélectionnées.

  • N’appelez pas la DataGridView.AreAllCellsSelected méthode. Cette méthode peut entraîner la non-partage des lignes.

  • N’appelez pas la DataGridView.SelectAll méthode lorsque la valeur de propriété DataGridView.SelectionMode est CellSelect. Cela entraîne l’annulation du partage de toutes les lignes.

  • Ne définissez pas la ou Selected la ReadOnly propriété d’une cellule false sur laquelle la propriété correspondante dans sa colonne est définie truesur . Cela entraîne l’annulation du partage de toutes les lignes.

  • N’accédez pas à la DataGridViewRowCollection.List propriété. Cela entraîne l’annulation du partage de toutes les lignes.

  • N’appelez pas la Sort(IComparer) surcharge de la Sort méthode. Le tri avec un comparateur personnalisé entraîne l’annulation du partage de toutes les lignes.

Voir aussi