Utilizzare un Enum come DataSource per una ComboBox – Enums as DataSource


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”;

Questo il risultato grafico:

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? 😉


Rispondi

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s…

%d blogger hanno fatto clic su Mi Piace per questo: