[OT] Under the Bridge...

Per la cronaca: questo week-end sarà lungo esattamente 4 giorni e 1 ora... tra sabato e domenica ne recuperiamo una per l'ora solare!!!

Cosa fare dunque? Mmmmh... Quante cose che farà Igor... si è proprio impegnato tutto il week-end, cavolo! Non posso essere da meno. Potrei fare quello che faccio di solito... nooo.. dormire 4g+1h è troppo anche per me!

Penso che l'unica cosa che farò oltre a dormire e rilassarmi sarà preparare gli altri POST sulla PropertyGrid, così mi porto avanti... tanto la mia ragazza è impegnata per la tesi... deve guardarsi 360h di registrazione televisiva... pure questo è troppo anche per me!
Probabilmente mi troverò con amici per qualche LAN-Party notturno, di quelli in cui si vince per "sfinimento" dell'avversario... questo fa per me! Si spazierà tra Half-Life, Counter Strike, Wolfestein Enemy-Territory, Vietcong e se c'è tempo ci si può organizzare per qualche mini-torneo a Roma Total War o Empire earth... ma per questo serve più di qualche ora... potrebbe fare per me!

Al ritorno dal week-end, per finire, mi aspettano 2 o 3 serate per festeggiare il mio compleanno... il 2 novembre... giorno dei morti... niente battute, grazie...

Come al solito...

...fletto i muscoli e sono nel ponte!!

Buon week-end a tutti...

powered by IMHO 1.3

[ PropertyGrid 01 ] Primi passi...

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!

powered by IMHO 1.3