ajouter par colonne & les lignes de WPF Datagrid
Je suis nouveau sur WPF. Je veux juste savoir comment devrions-nous ajouter des colonnes et des lignes par programme pour un contrôle DataGrid dans WPF. La façon dont nous avons l'habitude de le faire dans les windows forms. créer des colonnes et de lignes, et le lier à DataGrid.
Je crois WPF DataGrid est un peu différente de celle utilisée dans ASP.net et Windows form (corrigez-moi si je me trompe).
Je n'ai Pas. de lignes et de colonnes qui j'ai besoin de tirer dans la grille de données de sorte que l'utilisateur peut modifier les données dans les cellules.
Vous devez vous connecter pour publier un commentaire.
De par programmation d'ajouter une ligne:
De par programmation d'ajouter une colonne:
Découvrez ce post sur le WPF DataGrid forum de discussion pour plus d'informations.
Binding("[FirstName]")
voir ma réponse précédente ci-dessous, qu'il fonctionne, mais il est significativement plus lent lors de la liaison de grands ensembles de données.DataItem
est un objet, comment il a ressembler?essayez , ça marche à 100 % : ajouter des colonnes et des lignes par programmation :
vous devez créer un élément de la classe au premier abord :
J'ai eu le même problème. L'ajout de nouvelles lignes à WPF
DataGrid
nécessite un tour.DataGrid
s'appuie sur les domaines de la propriété d'un élément de l'objet.ExpandoObject
permet d'ajouter de nouvelles propriétés dynamique. Le code ci-dessous explique comment faire://edit:
Noter que ce n'est pas la façon dont le produit doit être utilisé, cependant, il simplifie beaucoup de choses, si vous avez seulement généré par programmation des données (par exemple. dans mon cas: une séquence de caractéristiques et de réseau de neurones de sortie).
J'ai trouvé une solution qui ajoute des colonnes lors de l'exécution, et se lie à un
DataTable
.Malheureusement, avec 47 colonnes définies de cette façon, il ne veut pas se lier à des données assez rapide pour moi. Des suggestions?
xaml
xaml.cs
en utilisant le Système.De Windows.De données;
modifier: désolé, je n'ai plus le code mentionné ci-dessous. C'était une solution élégante, bien que complexe.
J'ai posté un exemple de projet qui décrit comment utiliser PropertyDescriptor et lambda délégués dynamique ObservableCollection et DynamicObject remplir une grille avec fortement typées définitions de colonne.
Les colonnes peuvent être ajoutées/supprimées lors de l'exécution dynamiquement. Si vos données n'est pas un objet avec un type connu, vous pouvez créer une structure de données qui permettrait d'accéder par n'importe quel nombre de colonnes et de spécifier un PropertyDescriptor pour chaque "colonne".
Par exemple:
Vous pouvez définir des colonnes de cette façon:
Ou encore mieux, dans le cas de certains objets réels
Vous pouvez spécifier des colonnes fortement typé (liées à votre modèle de données):
Alors que vous venez de lier aux Utilisateurs des collections et des colonnes sont générés automatiquement que vous speficy eux. Les chaînes transmises à la propriété descripteurs sont des noms pour les en-têtes de colonne. Au moment de l'exécution, vous pouvez ajouter plus de PropertyDescriptors pour les "Utilisateurs" ajouter une autre colonne de la grille.
Si vous avez déjà le databinding en place John Myczek réponse est complète.
Si vous avez au moins 2 options que je connais, si vous souhaitez spécifier la source de vos données. (Cependant, je ne suis pas sûr de savoir si ou non ce qui est dans
ligne avec la plupart des lignes directrices, comme MVVM)
option 1: comme JohnB dit. Mais je pense que vous devriez utiliser votre propre collection
au lieu d'un faiblement typé DataTable (aucune infraction, mais vous ne pouvez pas dire à partir de la
code ce que chaque colonne représente)
xaml.cs
dans xaml.cs
Si votre type a une propriété Prénom défini, vous pouvez faire ce que John Myczek souligné.
De toute évidence, cela ne fonctionne pas si vous ne connaissez pas les propriétés que vous aurez besoin de montrer dans votre grille de données, mais si c'est le cas, vous pouvez avoir plus de problèmes à résoudre, et je crois que c'est hors de portée ici.
Si vous avez déjà le databinding en place John Myczek réponse est complète.
Si non vous avez au moins 2 options que je connais, si vous souhaitez spécifier la source de vos données. (Cependant, je ne suis pas sûr de savoir si ou non ce qui est en ligne avec la plupart des lignes directrices, comme MVVM)
Ensuite il suffit juste de se lier aux Utilisateurs des collections et des colonnes sont générés automatiquement que vous speficy eux. Les chaînes transmises à la propriété descripteurs sont des noms pour les en-têtes de colonne. Au moment de l'exécution, vous pouvez ajouter plus de PropertyDescriptors pour les "Utilisateurs" ajouter une autre colonne de la grille.