Tra le tante proprietà dei controlli troviamo:
- il flag Enabled, True rende il controllo abilitato all'input utente False il controllo è disabilitato;
- BackColor, setta il colore dello sfondo;
- ForeColor, setta il colore usato per esporre il testo.
Questi sono i 3 elementi chiamati in causa in questo articolo.
La disabilitazione di un controllo fa in modo che esso appaia solitamente grigio con testo anch'esso in grigio e talvolta poco leggile. Provando con una textbox standard si noterà che in caso di disabilitazione, il valore del ForeColor verrà ignorato e prenderà il valore definito nello schema colori, del sistema operativo, attivo in quel momento.
Analizziamo una problematica che si può presentare in un form ricco di controlli diversi tra loro, spesso raccolti in groupbox, i quali in determinate situazioni devono essere tutti disabilitati o solo alcuni. Nel primo caso la cosa più semplice è impostare la proprietà Enabled del contenitore a False anzichè effettuare a runtime un ciclo foreach che effettua questa operazione su tutti i controlli in esso contenuti.
Ma come fare a disabilitare le TextBox e cambiarne le caratteristiche legate ai colori? Le soluzioni possono essere le seguenti:
1) Creare un custom control che eredita le sue caratteristiche da System.Windows.Forms.TextBox e, tramite l'override del metodo che effettua il rendering, si ridefinisce il comportamente del controllo quando disabilitato. Ecco un esempio:
public class CustomTextBox : Control
{
protected override void OnPaint(PaintEventArgs e)
{
SolidBrush drawBrush;
base.OnPaint(e);
if (this.Enabled)
{
drawBrush = new SolidBrush(ForeColor); //ForeColor property
}
else
{
drawBrush = new SolidBrush(Color.Aquamarine); //ForeColor property
}
//DrawString(stringa da stampare, font dei caratteri, il colore di stampa, e le coordinate in centesimi di pollice dell'angolo superiore sinistro del testo
e.Graphics.DrawString(Text, Font, drawBrush, 0, 0);
}
}
2) Invece di disabilitare la TextBox , la si rende ReadOnly, in questo modo l'utente non potrà comunue interagire col controllo ma il programma potrà gestirlo sotto ogni aspetto.
foreach (Control ctrl in grbContainer)
{
if (ctrl.GetType().Name == "System.Windows.Forms.TextBox")
{
((TextBox)ctrl).ReadOnly = true;
((TextBox)ctrl).BackColor = System.Drawing.Color.Blue;
((TextBox)ctrl).ForeColor = System.Drawing.Color.YellowGreen;
}
else
{
ctrl.Enabled = false;
}
}
Questa vuole solo essere una linea guida per coloro che sviluppano software e talvolta si scontrano con problematiche ambientali quali illuminazione dei locali in cui lavora l'utente, e viene richiesta una particolare attenzione all'ergonomia del layout dell'applicazione, ad esempio viene richiesta una maggiore visibilità dei controlli disabilitati poichè l'utente lavora in un luogo molto esposto all'esterno e i riflessi della luce sullo schermo rendono difficile la lettura e/o distinzione dei questi elementi visuali.