2009-07-01 5 views
37

J'ai une classe comme ceci:Y at-il un attribut que je peux utiliser dans ma classe pour dire DataGridView ne pas créer une colonne pour elle lorsqu'elle est liée à une liste <MyClass>

private class MyClass { 
    [DisplayName("Foo/Bar")] 
    public string FooBar { get; private set; } 
    public string Baz { get; private set; }  
    public bool Enabled; 
} 

Lorsque je crée un List<MyClass> et attribuer au DataSource d'un DataGridView, la grille me montre deux colonnes, "Foo/Bar" et "Baz". C'est ce que je veux arriver.

Cela fonctionne actuellement car Enabled est un champ, pas une propriété - DataGridView ne récupère que les propriétés. Cependant, c'est un hack sale.

Je souhaite également activer une propriété, mais je la cache toujours dans DataGridView.

Je sais que je peux supprimer manuellement la colonne après la liaison .. mais ce n'est pas idéal.

Existe-t-il un attribut similaire à DisplayName, avec lequel je peux marquer une propriété? Quelque chose comme [Visible(false)]?

Répondre

67

[Browsable(false)] va masquer une propriété d'un DataGridView.

Un concepteur visuel affiche généralement dans la fenêtre Propriétés ces membres qui ont soit pas d'attribut explorable ou sont marqués avec le paramètre explorable du constructeur BrowsableAttribute valeur true. Ces membres peuvent être modifiés au moment du design. Les membres marqués avec le paramètre navigable du constructeur BrowsableAttribute défini sur false sont ne sont pas appropriés pour l'édition au moment du design et ne sont donc pas affichés dans un concepteur visuel. La valeur par défaut est true.

+3

C'est drôle, à mes yeux [Bindable (false)] devrait fonctionner et Browsable (selon l'aide) ne définit que si une propriété est affichée dans le PropertyGrid. Mais Bindable (false) est ignoré par DataGridView. –

+5

Je suis d'accord, mais après avoir lu (et relu) les lignes directrices de conception de cadre (http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756), j'ai constaté que les concepteurs didn ne suivent pas toujours leurs propres règles (et ont parfois fait des choses qui n'ont pas de sens). –

+0

Tous ces contrôles utilisent 'System.ComponentModel.PropertyDescriptor' et utilisent donc la même logique pour inclure/exclure des membres. Les classes 'ComponentModel' sont personnalisables, mais cela est rare car c'est tellement de travail. –

9

que je suis pas au courant que le béatement décorateur System.ComponentModel attributs tels que BrowsableAttribute et il est proche parent étaient liés à autre chose que la liaison à un PropertyGrid. (facepalm) J'aime l'approche de C-Pound Guru car elle vous permet de garder votre interface graphique plus lâchement couplée que ce que j'ai fait dans le passé. Pour une perspective différente, l'approche que j'ai utilisée depuis longtemps est de prédéfinir des colonnes dans votre DataGridView, soit par programmation, soit par l'intermédiaire du Concepteur de fiches. Lorsque vous faites cela, vous pouvez définir le DataPropertyName de chaque colonne au nom de votre propriété. La seule astuce est que vous devez définir la propriété AutoGenerateColumns de DataGridView sur false sinon la DGV ignorera complètement vos colonnes créées manuellement. Notez que, pour une raison quelconque, la propriété AutoGenerateColumns est masquée dans la grille de propriétés du Concepteur de fiches ... aucune idée pourquoi. Le seul avantage que je vois à cette approche est que vous pouvez pré-définir la mise en forme de la colonne et ainsi de suite - vous n'avez pas à lier et ensuite modifier les paramètres de rendu/dimensionnement des colonnes.

Voici un exemple de ce que je veux dire:

_DGV.AutoGenerateColumns = false; 
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn(); 
textColumn.DataPropertyName = "FooBar"; 
textColumn.HeaderText = "Foo/Bar"; // may not need to do this with your DisplayNameAttribute 
_DGV.Columns.Add(textColumn); 
textColumn = new DataGridViewTextBoxColumn(); 
textColumn.DataPropertyName = "Baz"; 

List<MyClass> data = GetMyData(); 
_DGV.DataSource = data; 
+1

Je suis content de voir que je ne suis pas le seul à ne pas avoir accès à la propriété 'AutoGenerateColumns' via le Concepteur de fiches. –