Comment faire pour n'afficher que certaines colonnes dans un DataGridView avec des objets personnalisés
J'ai un DataGridView et j'ai besoin d'ajouter des objets personnalisés. Considérons le code suivant:
DataGridView grid = new DataGridView();
grid.DataSource = objects;
Avec ce code j'obtiens un DataGridView objet de toutes les propriétés sous forme de colonnes. Dans mon cas, je ne veux pas montrer l'ensemble de cette information; je veux montrer à tout juste deux ou trois colonnes. Je sais que je peux
AutoGenerateColumns = false
.
Mais je ne sais pas comment procéder par la suite.
Une option est de masquer toutes les colonnes qui ne m'intéresse pas, mais je pense qu'il serait préférable de le faire dans le sens inverse. Comment puis-je faire cela?
OriginalL'auteur Cristhian Boujon | 2013-02-10
Vous devez vous connecter pour publier un commentaire.
Chaque fois que je le fais j'ai l'habitude de faire
grid.DataSource
le résultat d'une projection de LINQ sur les objets.Donc quelque chose comme ceci:
La bonne chose est que vous pouvez ensuite définir
AutoGenerateColumns
à true, ce qui va générer des colonnes basées sur les propriétés des objets projetés.Edit:
Le seul inconvénient de cette approche est qu'en projetant le tout dans un objet anonyme, vous pouvez avoir des problèmes dans des situations où vous avez besoin d'accéder à un objet spécifique dans un événement de clic, par exemple.
Dans ce cas, vous pourriez être mieux de définir explicitement un modèle de vue et la projection d'objets dans ceux. E. g.,
Edit 2:
MyViewModel
représente toutes les colonnes que vous souhaitez afficher dans laDataGridView
. L'exemple des propriétés doit être renommé en fonction de ce que vous faites. En général, le point d'un ViewModel est de servir comme une sorte de convertisseur qui est le médiateur entre le modèle (dans votre cas, votre liste d'objets) et de la vue.Si vous êtes désireux de conserver une référence à l'objet sous-jacent, la meilleure façon peut-être de fournir via le constructeur:
La raison pour laquelle j'ai passé pour une méthode get pour récupérer le modèle sous-jacent de l'objet est tout simplement pour éviter une colonne générée.
Mais de cette manière je m'ennuie de l'objet de référence ou je me trompe?
qu'entendez-vous par là?
J'ai besoin de récupérer mon objet personnalisé quand je clique sur une ligne. Si je le fais de cette façon je ne peux pas l'obtenir. Je suis de droite?
Voir mon edit.
OriginalL'auteur nick_w
Vous pouvez également utiliser l'Attribut [Consultable(false)] sur une propriété dans les Objets sous-jacents, qui peuvent être appropriées. Bien sûr, cela serait préempter la colonne de navigation capable en un autre endroit, de sorte que vous pourriez trouver que souhaitable.
:D
OriginalL'auteur John
Vous pouvez utiliser databindings avec
AutoGenerateColumns = false
et à l'aide de DataPropertyName comme ceDe cette façon, seuls les colonnes seront affichées dans le datagridview, et vous pouvez créer des colonnes dans l'éditeur si vous le souhaitez. Propriétés publiques peut être n'importe quel attribut public au sein de votre objet.
Si vous modifiez vos données à partir de la datagridview, alors vous devriez utiliser NotifyPropertyChanged dans l'ensemble des méthodes.
Se ma question/réponse ici où j'explique cet tout le chemin vers le bas.
OriginalL'auteur Alejandro del Río
Vous pouvez faire quelque chose comme cela.
Pour afficher uniquement les particluar colonnes dans un
DataGridView
vous effectuez d'abord les données dans unDataTable
comme ça.Je sais que c'est un très long processus.Ceux qui vont pour la performance peut ne pas aimer cela. 😛
Mais je pense que cela fonctionne bien.
OriginalL'auteur Sujith H S
C'est mon code à partir d'un vieux projet. Il peut travailler pour votre cas.
OriginalL'auteur Ahmet Uğur
OriginalL'auteur SachIn Harge