Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

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();
 
   }


© 2020 Carlo Vecchio
Torna ai contenuti