136 votes

Lier une énumération à une boîte combo WinForms, puis la définir

De nombreuses personnes ont répondu à la question de savoir comment lier une énumération à une boîte combo dans WinForms. C'est comme ça :

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

Mais cela ne sert à rien si l'on ne peut pas définir la valeur réelle à afficher.

J'ai essayé :

comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null

J'ai également essayé :

comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1

Quelqu'un a-t-il une idée de la manière de procéder ?

176voto

Amir Shenouda Points 431

L'Enum

public enum Status { Active = 0, Canceled = 3 }; 

Définir les valeurs de la liste déroulante à partir de celle-ci

cbStatus.DataSource = Enum.GetValues(typeof(Status));

Récupérer l'enum de l'élément sélectionné

Status status; 
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status);

48voto

dr.Crow Points 1355

Pour simplifier :

Initialiser d'abord cette commande : (par exemple, après InitalizeComponent() )

yourComboBox.DataSource =  Enum.GetValues(typeof(YourEnum));

Pour récupérer l'élément sélectionné dans la combobox :

YourEnum enum = (YourEnum) yourComboBox.SelectedItem;

Si vous voulez définir une valeur pour la combobox :

yourComboBox.SelectedItem = YourEnem.Foo;

15voto

jmservera Points 3239

Le code

comboBox1.SelectedItem = MyEnum.Something;

est ok, le problème doit résider dans le DataBinding. Les assignations de DataBinding se produisent après le constructeur, principalement la première fois que la combobox est affichée. Essayez de définir la valeur dans l'événement Load. Par exemple, ajoutez ce code :

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    comboBox1.SelectedItem = MyEnum.Something;
}

Et vérifiez si ça marche.

14voto

rein Points 15639

Essayez :

comboBox1.SelectedItem = MyEnum.Something;

EDITS :

Oups, vous avez déjà essayé. Cependant, cela a fonctionné pour moi lorsque ma comboBox a été configurée pour être une DropDownList.

Voici mon code complet qui fonctionne pour moi (avec les deux DropDown et DropDownList) :

public partial class Form1 : Form
{
    public enum BlahEnum
    { 
        Red,
        Green,
        Blue,
        Purple
    }

    public Form1()
    {
        InitializeComponent();

        comboBox1.DataSource = Enum.GetValues(typeof(BlahEnum));

    }

    private void button1_Click(object sender, EventArgs e)
    {
        comboBox1.SelectedItem = BlahEnum.Blue;
    }
}

12voto

ncoder83 Points 43

Disons que vous avez l'enum suivant

public enum Numbers {Zero = 0, One, Two};

Vous devez disposer d'une structure pour faire correspondre ces valeurs à une chaîne de caractères :

public struct EntityName
{
    public Numbers _num;
    public string _caption;

    public EntityName(Numbers type, string caption)
    {
        _num = type;
        _caption = caption;
    }

    public Numbers GetNumber() 
    {
        return _num;
    }

    public override string ToString()
    {
        return _caption;
    }
}

Maintenant, renvoyer un tableau d'objets avec tous les enums mappés à une chaîne :

public object[] GetNumberNameRange()
{
    return new object[]
    {
        new EntityName(Number.Zero, "Zero is chosen"),
        new EntityName(Number.One, "One is chosen"),
        new EntityName(Number.Two, "Two is chosen")
    };
}

Et utilisez ce qui suit pour remplir votre boîte combo :

ComboBox numberCB = new ComboBox();
numberCB.Items.AddRange(GetNumberNameRange());

Créez une fonction pour récupérer le type de l'enum au cas où vous voudriez le passer à une fonction

public Numbers GetConversionType() 
{
    EntityName type = (EntityName)numberComboBox.SelectedItem;
    return type.GetNumber();           
}

et ensuite, tout devrait bien se passer :)

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