Eccomi ancora una volta a riportare sul blog la soluzione di un problemino di programmazione che mi ha appena fatto perdere un paio d’ore…
Preciso subito quali sono le fonti; il codice è stato preso e riadattato da due siti web, i quali trattavano l’argomento ma con delle piccole differenze rispetto a quanto servisse a me, e da un riferimento a msdn Microsoft.
http://stackoverflow.com/questions/1177915/binding-a-datasource-with-some-enum-values
http://developcode.blogspot.com/2006/12/dropdownlists-with-enums-as-datasource.html
http://msdn.microsoft.com/it-it/library/5tbh8a42%28v=VS.90%29.aspx
Il problema è il seguente: utilizzare un Enum in C# per popolare una ComboBox, visualizzando gli alias testuali ma utilizzando i valori numerici sottostanti per eseguire l’associazione manuale con un oggetto, da persistere mediante NHibernate.
L’oggetto in gestione è “Utente”, che ha diversi permessi per l’accesso all’applicazione. Di seguito la definizione dell’Enum:
public enum LivelloAccesso { Magazzino = 1, Ufficio = 2, Amministratore = 3};
Notare che ho esplicitato il valore delle costanti in Enum, al fine di essere sicuro di quali valori NH avrebbe poi salvato sul database.
Per completezza, nel mapping di NH ho indicato la proprietà come Int32
<property name=”livelloAccesso” column=”livelloAccesso” type=”Int32″ />
mentre nel codice
public virtual LivelloAccesso livelloAccesso { get; set; }
in modo che NH fosse in grado di effettuare automaticamente il mapping tra valori enum e gli Int32 associati.
Tornando all’argomento principale, questo è il codice utilizzato per mappare l’enum LivelloAccesso su una ComboBox in grafica:
List<KeyValuePair<int, string>> listaLivelliAccesso = new List<KeyValuePair<int, string>>();
foreach (Enum enumValue in Enum.GetValues(typeof(LivelloAccesso)))
{
listaLivelliAccesso.Add(new KeyValuePair<int, string>(Convert.ToInt16(enumValue),
enumValue.ToString()));
}
cmbLivelloAccesso.DataSource = listaLivelliAccesso;
cmbLivelloAccesso.DisplayMember = “Value”;
cmbLivelloAccesso.ValueMember = “Key”;
Da notare che non ho usato il termine Binding perchè l’associazione tra la combo e la proprietà dell’oggetto viene effettuata “a mano” mediante il seguente codice:
cmbLivelloAccesso.SelectedValue = Convert.ToInt32(i_utente.livelloAccesso);
Ovviamente conversione inversa dovrà essere fatta in fase di salvataggio dell’oggetto. Al momento non ho ancora completato il codice, per cui non riporto tale conversione, rimandando la sua scrittura su un eventuale commento successivo.
Una evoluzione potrebbe essere quella di eseguire il vero e proprio Binding tra la combo e l’oggetto… Chi mi aiuta? 😉