Disons que j'ai une propriété que je veux afficher dans un DataGridView, mais pas lorsque le même objet est affiché dans un PropertyGrid. Je sais que je peux utiliser [Browsable(false)]
mais cela le cache dans les deux vues. Je peux aussi faire un gridView.Columns["blah"].Visible = false;
mais c'est l'inverse de ce que je veux, car il est masqué dans le DataGridView mais pas dans le PropertyGrid. Existe-t-il un moyen de faire l'inverse ? (A moins de créer une toute nouvelle DataTable juste pour contenir les mêmes données moins un champ, et de tout relier à celle-ci à la place - c'est vraiment une façon peu pratique de faire les choses). Alternativement, je pourrais vivre avec une solution qui ajoute une colonne au DataGridView qui n'est pas présente sur la classe réelle.
Réponse
Trop de publicités?Il est possible de résoudre ce problème en utilisant la propriété BrowsableAttributes d'une PropertyGrid. Tout d'abord, créez un nouvel attribut comme ceci :
public class PropertyGridBrowsableAttribute : Attribute
{
private bool browsable;
public PropertyGridBrowsableAttribute(bool browsable){
this.browsable = browsable;
}
}
Ajoutez ensuite cet attribut à toutes les propriétés que vous souhaitez voir apparaître dans votre PropertyGrid :
[DisplayName("First Name"), Category("Names"), PropertyGridBrowsable(true)]
public string FirstName {
get { return ... }
set { ... }
}
Définissez ensuite la propriété BrowsableAttributes comme suit :
myPropertyGrid.BrowsableAttributes = new AttributeCollection(
new Attribute[] { new PropertyGridBrowsableAttribute(true) });
Cela n'affichera que les propriétés attribuées dans votre grille de propriétés et le DataGridView peut toujours accéder à toutes les propriétés avec seulement un peu plus d'effort de codage.
J'irais quand même dans le sens de Tergiver et qualifierais ce comportement de bogue, puisque la documentation de l'attribut Browsable indique clairement son utilisation pour la propriété Windows uniquement.
(Le crédit va à l'utilisateur "maro" à http://www.mycsharp.de/wbb2/thread.php?postid=234565 )