Premessa
e precisazioni
Questo è il primo di una breve serie di
Post in cui voglio fissare e condividere alcune delle conoscenze che ho
acquisito, in questi ultimi mesi, nell'uso della PropertyGrid.
Mi scuso anticipatamente con chi riterrà "offensivo" il livello di
difficoltà dei primi Post , ma per arrivare a qualcosa di più
"tecnico" devo passare prima per quei concetti
che tutti devono conoscere prima di affrontare quelli più avanzati... e poi mi
devo fare le ossa, scusatemi, non ho molta dimestichezza a scrivere in
pubblico...
Il mio desiderio in
questi Post non è quello di portare alla vostra conoscenza concetti nuovi
o tecnologie avanzate, ma, più semplicemente, riportare in modo semplice e quasi
banale alcune delle mie conoscenze, tenendo bene a mente che "l'unica cosa che so è di non sapere"...
Quindi vi esorto a mandarmi tutti i
commenti che ritenete opportuni: insulti, suggerimenti, precisazioni e
quant'altro.
...fletto i muscoli e sono
nell'...
Introduzione
Chiunque lavori con Visual Studio conosce questo potentissimo
strumento che permette di navigare, visualizzare ed editare le proprietà di
tutto ciò che compone il nostro progetto: sia i componenti delle Form, sia i
file, sia i progetti e le soluzioni.
Gli elementi che compongono la nostra PropertyGrid sono:
- le Property (eventualmente espandibili)
- le intestazioni delle Categorie
- la Descrizione estesa della Property
- i Tab che raggruppano le Properties
- gli Editor ed i Type Converter
Nella sua versione base, fornita nel Framework, è tipicamente utilizzata per
gestire le Property di istanze in run-time: permette di avere una interfaccia
generica per l'editing delle nostre classi, caratteristica importantissima per
WinForm di configurazione, ad esempio.
Utilizzo della
PropertyGrid
Per l'inserimento di una PropertyGrid nella nostra WinForm possiamo affidarci
al comodo Drag&Drop di VS.NET, non prima di averlo aggiunto nella ToolBox
(di default non è presente) selezionando "PropertyGrid", appunto, tra i
Componenti del Framework.
Ora, per visualizzare un oggetto nella nostra PropertyGrid è sufficiente
impostare il "SelectedObject". Nell'esempio seguente, imposto come oggetto
selezionato la Form che contiene la griglia, in modo da poterne modificare le
cratteristiche in run-time.
private void Form1_Load(object sender, System.EventArgs e)
{
this.propertyGrid1.SelectedObject = this;
}
Se provate a visualizzare la Form di cui sopra, sarete in grado
di modificare tutte le Property della maschera visualizzata. Potrete, ad
esempio, modificarne le dimensioni ed il titolo... vi sconsiglio di impostate a
"false" la property "Visible"...
Impostare la visibilità
delle Property
Se provate a
creare una classe personalizzata e ne date in pasto una istanza
alla PropertyGrid, vedrete che, a differenza di quanto visto per
la From dell'esempio precedente, le property non saranno divise in gruppi e non saranno
presenti le descrizioni che tanto mi sono utili quando cerco "quella-property-che-fa-quella-cosa-che-adesso-non-ricordo-il-nome...".
Per rimediare
a questo inconveniente è necessario tirare fuori gli attributi, nel senso buono
del termine... bisogna, cioè, decorare le nostre classi e le relative Proprietà
con i seguenti attributi (in ordine alfabetico):
- DefaultValueAttribute: identifica il valore di
default della nostra property. La PropertyGrid evidenzia automaticamente i
valori differenti da quello di default;
- DefaultPropertyAttribute: identifica la property
che viene selezionata appena la PropertyGrid riceve in pasto una istanza della
nostra classe;
- BrowsableAttribute: imposta la visibilità di una
property, permettere di nascondere una property che, per default, è visibile
nella PropertyGrid;
- CategoryAttribute: imposta la categoria di
appartenenza della property, permette di raggrupparle per tipologia. Se non
impostato le property vengono raccolte nella categoria "Varie" ("Misc" in
inglese).
- DescriptionAttribute: imposta la descrizione
estesa della property, quella che viene visualizzata nel riquadro di Help in
fondo alla PropertyGrid;
- ReadOnlyAttribute: permette di rendere in "sola lettura"
una property che, se fornita di get e set, è normalmente in
"lettura-scrittura";
Di seguito riporto una classe di esempio, nella quale sono utilizzati tutti
gli attributi appena descritti:
[DefaultProperty("Id")]
public class Foo
{
public Foo(){}
private int id;
[Description("Identificativo dell'elemento")]
[Category("Configurazione")]
public int Id { get {return id;} set{id = value;}}
private bool visible;
[Description("Ottiene o imposta la visibilità dell'elemento.")]
[Category("Aspetto")]
[DefaultValue("true")]
public bool Visible {get {return visible;} set{visible = value;}}
private double hidden;
[Browsable(false)]
public double Hidden {get {return hidden;} set{hidden = value;}}
private DateTime creation;
[Description("Ottiene la data di creazione dell'elemento.")]
[Category("Aspetto")]
public DateTime Creation {get {return creation;} set{creation = value;}}
}
Visualizzando una istanza di Foo nella PropertyGrid otterrete i seguenti
risultati:
- Id sarà la
property selezionata di default e sarà visualizzata sotto la Categoria
"Configurazione";
- Visible e Creation saranno visualizzate
sotto la Categoria "Aspetto";
- Hidden non sarà
visibile;
- Creation sarà
visualizzata in solo lettura;
- Il valore di default (non evidenziato) di Visible sarà
"true";
Conclusioni
In questa rapida carrellata abbiamo visto come
aggiungere una PropertyGrid, come usarla e come decorare le nostre classi con
gli attributi principali. Quanto spiegato non è tuttavia sufficiente nel caso in
cui la nostra classe presenti delle Property di tipo diverso da
quelli base (string, int, double, etc...)
Nei prossimi Post parlerò di Property "Espandibili", di
ExpandableObjectConverter, di TypeConverter e di UITypeEditor.
Rat-saluti a tutti!