ComboBox est lié aux valeurs d’un type enum tout en ayant un & # 8220; blanc & # 8221; entrée?

StackOverflow https://stackoverflow.com/questions/807030

Question

Si je lie un objet WinForms ComboBox aux valeurs d'un type enum, c'est-à-dire

combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));

Qui sait comment je pourrais obtenir le même résultat alors que, en plus des entrées correspondant à chaque valeur enum, je peux également avoir une entrée vide ne représentant aucune sélection?

Je ne peux pas simplement ajouter une valeur spéciale au type enum, car il doit être flexible pour traiter n'importe quel type enum.

J'apprécierais votre aide.

Modifier: je dois préciser que je souhaite lier les valeurs enum réelles et non leurs noms. Si les valeurs enum réelles sont liées, la zone de liste déroulante prend soin d’appeler leur ToString () pour obtenir le texte à afficher.

Était-ce utile?

La solution 3

(Veuillez voir ma modification à la question où j'ai précisé que je ne voulais pas me lier à une collection de chaînes).

Après plus de tripes, la monstruosité suivante semble fonctionner. combo1.SelectedItem est de type objet et sera soit une valeur DBNull, soit une valeur enum (boxed?). Ce code est-il conseillé?

combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

Modifier: Je vois que les méthodes d'Adam et Andrew pourraient facilement être adaptées pour faire la même chose. Merci les gars!

Autres conseils

Vous ne savez pas si vous avez essayé tout le code que vous avez publié ou non, mais vous ne pouvez pas ajouter d'éléments faire une ComboBox de type databound. Il s’agit de winforms et non de WPF. Il n’existe donc pas de " DataBind " fonction.

Vous pouvez faire ceci:

public static string[] GetEnumValues<T>(bool includeBlank) 
{
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString()));

    if (includeBlank)
    {
        values.Insert(0, string.Empty);
    }

    return values.ToArray();
}

Alors

combo.DataSource = GetEnumValues<myEnumType>(true);

Vous pouvez essayer quelque chose comme ceci:

( Modifié pour refléter l'excellente suggestion de Brad_Z )

static IEnumerable<String> getValues<T>(String initialValue)
{
    yield return initialValue;

    foreach (T t in Enum.GetValues(typeof(T)))
        yield return t.ToString();
}

static IEnumerable<String> getValues<T>()
{
    return getValues<T>(String.Empty);
}

Cela vous permettra de vous lier aux résultats de cette fonction comme ceci:

combo1.DataSource = getValues<myEnumType>().ToArray();

ou comme ceci, si vous souhaitez spécifier une valeur différente pour l'élément initial:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top