Comment puis-je utiliser un WinForms grille de propriété pour éditer une liste de chaînes de caractères?
Dans mon application j'ai une propriété de la grille pour permettre aux utilisateurs de modifier les paramètres. Cela fonctionne bien pour les cordes et les autres propriétés de valeur, mais ce dont j'ai besoin maintenant est une liste de chaînes de caractères qui peuvent être modifiés par les utilisateurs.
Le problème est que si j'ai MyPropertyGrid.SelectedObject = new { Test = new List<string>() };
dans mon code et que l'utilisateur tente de modifier le Test
des biens, lorsqu'ils cliquent sur le bouton Ajouter, l'erreur suivante se produit:
Constructor on type 'System.String' not found
Ce sens que les chaînes sont immuables. Cependant, j'ai encore besoin de stocker plusieurs chaînes de caractères (ou une chaîne de données) dans une propriété de la grille.
Quelqu'un a une idée sur comment je peux accomplir cela?
- Essayez ceci, MyPropertyGrid.SelectedObjec = Test //il va revenir liste de chaînes sur le bouton cliquez sur définir la liste de chaînes dans la propriété de Test....
- Je ne suis pas sûr de ce que tu veux dire pour essayer, comme il semble que votre code ont été mangés par les commentaires format.
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez spécifier un
System.ComponentModel.L'éditeur
l'attribut sur votre liste de chaînes de caractères,StringCollectionEditor
comme l'éditeur. Vous devez ajouter une référence à System.Design.Dll pour votre projet, pour que cette compilation.Exemple, supposons que votre objet est comme ceci:
La propriété de la grille pour qui ressemble à ceci:
Cliquez sur le
...
et vous obtenez:Si vous n'aimez pas la builtin collection de l'éditeur, vous pouvez implémenter votre propre collection de l'éditeur.
Mon exemple montre l'utilisation d'un TypeConverter attribut. Si vous ne pas le faire, puis la liste s'affiche dans la prop grille "(Collection)". Le TypeConverter il obtient l'affichage de quelque chose d'intelligent. Par exemple, pour afficher une courte représentation de chaîne de la collection dans la grille des propriétés, comme ceci:
...la TypeConverter est comme ceci:
Vous n'avez pas besoin d'un setter sur le
List<String>
, parce que la collection de l'éditeur n'a pas défini cette propriété, elle s'est contentée ajoute ou supprime des entrées à la propriété. Donc, il suffit de fournir à l'acquéreur.Si vous avez besoin d'une chaîne de caractères contenant juste utiliser:
BindingList<string>
au lieu delist<string>
L'éditeur est automatiquement créé.
Aussi, "casting" d'avant en arrière pour
List<T>
est facile.À partir de la Liste de BindingList suffit d'utiliser la
bList = BindingList(orignalList)
constructeur (si vous avez lu une seule erreur - l'insertion de la liste un par un). et pour obtenir la liste, vous pouvez utiliser le.ToList()
méthode d'extension.Déclaration de la propriété en manque un attribut important:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
Sans elle, le concepteur n'a pas sérialiser des données de la collection.