138 votes

Comment lier une Enum à un contrôle DropDownList en ASP.NET ?

Disons que j'ai l'énumération simple suivante :

enum Response
{
    Yes = 1,
    No = 2,
    Maybe = 3
}

Comment puis-je lier cet enum à un contrôle DropDownList afin que les descriptions soient affichées dans la liste et que la valeur numérique associée (1, 2, 3) soit récupérée une fois qu'une option a été sélectionnée ?

118voto

Mark Glorie Points 2300

Je ne le ferais probablement pas. lier les données étant donné qu'il s'agit d'une énumération, et qu'elles ne changeront pas après la compilation (à moins que je n'aie une de ces Stupide moments).

Il est préférable d'itérer dans l'énumération :

Dim itemValues As Array = System.Enum.GetValues(GetType(Response))
Dim itemNames As Array = System.Enum.GetNames(GetType(Response))

For i As Integer = 0 To itemNames.Length - 1
    Dim item As New ListItem(itemNames(i), itemValues(i))
    dropdownlist.Items.Add(item)
Next

Ou la même chose en C#

Array itemValues = System.Enum.GetValues(typeof(Response));
Array itemNames = System.Enum.GetNames(typeof(Response));

for (int i = 0; i <= itemNames.Length - 1 ; i++) {
    ListItem item = new ListItem(itemNames[i], itemValues[i]);
    dropdownlist.Items.Add(item);
}

1 votes

Merci beaucoup pour cette réponse. GetType(Response) n'a pas fonctionné pour moi car je reçois une instance de l'Enum, plutôt que la classe Enum. J'utilise donc enumInstance.GetType() à la place.

2 votes

En utilisant C#, cela ne fonctionne pas pour moi, car getValues et getNames renvoient tous deux la même chose, le premier comme des objets et le second comme des chaînes. La définition de l'enum est la suivante : public enum eResult { Right = 1, NoncontrolledError = 2,}

10 votes

D'ailleurs, en C#, vous ne pouvez pas accéder à un tableau avec l'index itemNames[i], vous ne pouvez le faire qu'avec arrayObject.GetValue(i) et de cette façon, il ne renvoie que le nom dans les deux cas.

73voto

Leyu Points 1844

Utilisez la classe utilitaire suivante Enumeration pour obtenir un IDictionary<int,string> (paire valeur et nom de l'Enum) à partir d'un fichier Énumération ; vous liez ensuite le IDictionnaire à un contrôle à lier.

public static class Enumeration
{
    public static IDictionary<int, string> GetAll<TEnum>() where TEnum: struct
    {
        var enumerationType = typeof (TEnum);

        if (!enumerationType.IsEnum)
            throw new ArgumentException("Enumeration type is expected.");

        var dictionary = new Dictionary<int, string>();

        foreach (int value in Enum.GetValues(enumerationType))
        {
            var name = Enum.GetName(enumerationType, value);
            dictionary.Add(value, name);
        }

        return dictionary;
    }
}

Exemple : Utilisation de la classe utilitaire pour lier des données d'énumération à un contrôle

ddlResponse.DataSource = Enumeration.GetAll<Response>();
ddlResponse.DataTextField = "Value";
ddlResponse.DataValueField = "Key";
ddlResponse.DataBind();

1 votes

+1. Je l'ai utilisé, mais je pense que la clé et la valeur sont inversées. Cela devrait retourner un IDictionary<string, int>

0 votes

Il faut noter que cela ne se comportera pas correctement pour tous les types d'enum (comme uint, ulong, long, etc.) Normalement, le champ le plus efficace à rechercher est la clé. Dans ce cas, ce serait l'int puisque les entiers sont une simple comparaison <,=,> contre la comparaison < et > d'une chaîne de caractères pour chaque caractère.

44voto

Feryt Points 1014

Je l'utilise pour ASP.NET MVC :

Html.DropDownListFor(o => o.EnumProperty, Enum.GetValues(typeof(enumtype)).Cast<enumtype>().Select(x => new SelectListItem { Text = x.ToString(), Value = ((int)x).ToString() }))

38voto

VanOrman Points 2149

Ma version est juste une forme comprimée de ce qui précède :

foreach (Response r in Enum.GetValues(typeof(Response)))
{
    ListItem item = new ListItem(Enum.GetName(typeof(Response), r), r.ToString());
    DropDownList1.Items.Add(item);
}

4 votes

Devrait être (int r in Enum.GetValues(typeof(Response)))), sinon la description sera simplement liée au nom et à la valeur...

2 votes

Cela ne fonctionne pas, car il insère le nom du membre de l'énumération dans la valeur du ListItem. La conversion en int fonctionnerait dans la plupart des cas, mais pas si l'énumération est un uint, un ulong ou un long.

0 votes

Une bien meilleure solution à mon avis.

28voto

public enum Color
{
    RED,
    GREEN,
    BLUE
}

Chaque type Enum dérive de System.Enum. Il existe deux méthodes statiques qui permettent de lier des données à un contrôle de liste déroulante (et d'en récupérer la valeur). Il s'agit de Enum.GetNames et Enum.Parse. En utilisant GetNames, vous pouvez lier votre contrôle de liste déroulante comme suit :

protected System.Web.UI.WebControls.DropDownList ddColor;

private void Page_Load(object sender, System.EventArgs e)
{
     if(!IsPostBack)
     {
        ddColor.DataSource = Enum.GetNames(typeof(Color));
        ddColor.DataBind();
     }
}

Maintenant, si vous voulez que la valeur de l'Enum revienne sur la sélection .....

  private void ddColor_SelectedIndexChanged(object sender, System.EventArgs e)
  {
    Color selectedColor = (Color)Enum.Parse(typeof(Color),ddColor.SelectedValue
  }

3 votes

Bonne réponse mais petite astuce : Couleur selectedColor = (Color)Enum.Parse(typeof(Color),ddColor.SelectedValue) ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X