ComboBox gebunden an einen Werte des Aufzählungstypen, während auch ein „leeres“ -Eintrag zu haben?

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

Frage

Wenn ich binden, um eine WinForms ComboBox an eine Werte des Aufzählungstyp, d.

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

Wer weiß, wie ich das gleiche Ergebnis erzielen konnte, während zusätzlich zu den Einträgen jeden ENUM-Wert übereinstimmt, kann ich auch einen leeren Eintrag keine Auswahl repräsentiert haben?

Ich kann einfach nicht einen besonderen Wert auf den Aufzählungstyp hinzugefügt werden, da diese flexibel sein müssen, mit jedem Aufzählungstyp zu behandeln.

Ich würde schätzen Ihre Hilfe.

Edit: Ich soll klarstellen, dass ich die tatsächlichen ENUM-Werte binden will und nicht ihre Namen. Wenn die tatsächlichen ENUM-Werte gebunden sind, nimmt die ComboBox Pflege ihr ToString von () aufrufen, um den Text zu erhalten angezeigt werden soll.

War es hilfreich?

Lösung 3

(Siehe mein bearbeiten auf die Frage, wo ich stellte klar, dass ich auf eine Sammlung von Zeichenketten binden wollen nicht).

Nach mehr geigen, scheint die folgende Ungeheuerlichkeit zu arbeiten. combo1.SelectedItem ist vom Typ Objekt und wird entweder ein DBNull oder sein (geschachtelt?) enum Wert. Ist dieser Code ratsam?

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

Edit: Ich sehe Adam und Andrew Methoden leicht angepasst werden, um das gleiche zu tun. Danke Jungs!

Andere Tipps

Nicht sicher, ob Sie Jungs haben alle den Code versucht, die Sie veröffentlichen oder nicht haben, aber Sie können nicht hinzufügen Artikel im Databound ComboBox tun. Dies ist WinForms, WPF nicht, so gibt es keine "DataBind" Funktion.

Sie können dies tun:

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();
}

Dann

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

Sie könnte so etwas wie diese versuchen:

( Herausgegeben Brad_Z ausgezeichneten Vorschlag zu reflektieren)

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);
}

Dies ermöglicht es Ihnen, die Ergebnisse dieser Funktion wie folgt zu binden:

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

oder wie diese, wenn Sie es wünschen, einen anderen Wert für den Anfangspunkt angeben:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top