C# - Lavorare con i combo box
C#
Un modo per utilizzare il ComboBox
- Il ComboBox può essere utilizzato in diversi modi.
- Generalmente i valori mostrati all'interno del ComboBox sono stringhe, mentre il programmatore vuole avere un 'collegamento' tra la stringa mostrata e qualche altro dato, per esempio un codice.
- Con il metodo seguente si inseriscono nel ComboBox degli oggetti (con varie proprietà che il programmatore può definire) e si può definire cosa mostrare nel controllo stesso. Infine, una volta selezionato un elemento del ComboBox, si ha l'accesso a qualsiasi proprietà dell'oggetto.
- La prima cosa da fare è definire la classe con tutte le proprietà da gestire; in questo esempio si ha la proprietà 'Codice' e la proprietà 'Descrizione'.
- Si è definito anche un semplice costruttore ed è stato fatto un override al metodo ToString().
public class CodiceDescrizione
{
public short Codice { get; set; }
public string Descrizione { get; set; }
public CodiceDescrizione(short codice, string descrizione)
{
this.Codice = codice;
this.Descrizione = descrizione;
}
public override string ToString()
{
return Descrizione;
}
}
- Si supponga che il ComboBox si chiami 'cmb1'; per caricare gli elementi nel ComboBox, il codice è il seguente:
cmb1.DropDownStyle = ComboBoxStyle.DropDownList;
cmb1.Items.Clear();
cmb1.Items.Add(new CodiceDescrizione(1, "Descrizione 1"));
cmb1.Items.Add(new CodiceDescrizione(2, "Descrizione 2"));
cmb1.Items.Add(new CodiceDescrizione(3, "Descrizione 3"));
- Per leggere le proprietà dell'elemento selezionato, il codice è il seguente. Si noti l'utilizzo del cast verso l'oggetto di tipo 'CodiceDescrizione'.
int i = ((CodiceDescrizione)cmb1.SelectedItem).Codice;
string s = ((CodiceDescrizione)cmb1.SelectedItem).Descrizione.ToString();
- Se invece si vuole impostare il valore selezionato del ComboBox, si può fare come mostrato qua:
int valore = 2; // Valore da selezionare nella Combo Box.
for (int i = 0; i < cmb1.Items.Count; i++)
{
CodiceDescrizione cd = (CodiceDescrizione)cmb1.Items[i];
if (cd.Codice == valore)
{
cmb1.SelectedIndex = i;
break;
}
}
- Oppure con il 'FindString()' purché sia certo che la stringa da trovare sia presente in un item:
cmb1.SelectedIndex = cmb1.FindString("Italia");
Impostare il colore di sfondo (DropDownList)
- Se il ComboBox ha la proprietà 'DropDownStyle' impostata a 'DropDownList', Windows lo disegna con un colore grigio e apparentemente non si riesce a modificarne il colore.
- Per risolvere questo problema ho trovato in Internet alcune soluzioni; le prime due non sono perfettamente funzionanti, la terza sì.
Prima soluzione
- Nel file 'Program.cs' eliminare la riga seguente:
Application.EnableVisualStyles();
- Problema: questo risolve il problema della ComboBox ma tutti gli altri controlli cambiano leggermente aspetto.
Seconda soluzione
- Impostare la proprietà seguente della ComboBox:
cmb1.FlatStyle = FlatStyle.Flat;
- Problema: questo risolve il problema del colore di sfondo della ComboBox, ma esteticamente non compare più il bordo e si presentano dei problemi di refresh se si modifica la larghezza del controllo a runtime (per esempio se la ComboBox è contenuta in una cella di una griglia).
Terza soluzione
- Impostare le proprietà seguenti della ComboBox:
cmb1.DropDownStyle = ComboBoxStyle.DropDownList;
cmb1.DrawMode = DrawMode.OwnerDrawFixed;
- Aggiungere l'evento seguente:
private void cmb1_DrawItem(object sender, DrawItemEventArgs e)
{
string txt = e.Index >= 0 ? cmb1.Items[e.Index].ToString() : "";
Brush brush = Brushes.Black;
e.DrawBackground();
e.Graphics.DrawString(txt, e.Font, brush, e.Bounds, StringFormat.GenericDefault);
e.DrawFocusRectangle();
}