Dieses HowTo beschreibt, wie man Enums mit Beschreibungen versehen kann und diese Beschreibungen dann beispielsweise in einer Combobox oder Listbox anzeigt.
Beispiel vorher:

So sehen die Einträge bisher aus. Für den Endanwender ziemlich unpraktisch.
Beispiel nachher:

So sollen die Einträge später angezeigt werden.
Auf gehts!
Unser Beispiel enum:
Public Enum eFileListActionType eflatNone = 0 eflatCompress = 1 eflatDeleteForever = 2 eflatRecyclebin = 3 eflatReplaceWithTextfile = 4 eflatReplaceWithLink = 5 eflatReplaceWithZeroByteFile = 6 eflatMoveToDirectory = 7 End Enum
Um nun alle Namen diesse Enums beispielsweise in einer Combobox anzuzeigen, kann man bekanntermaßen folgendes machen:
Me.cbFileActionType.Items.AddRange([Enum].GetNames(GetType(eFileListActionType)))Dann hätte man die Combobox mit den Werten eflatNone, eflatCompress usw. usf. gefüllt. Also praktisch so wie im ersten Bild oben. Dass das für den Endanwender nicht unbedingt ideal ist, sollte klar sein. Was wir also benötigen ist eine Möglichkeit den enums eine Beschreibung zu verpassen und diese Beschreibung stattdessen in die Combobox zu schreiben.
Zum Glück gibt es Reflection und das Attribut Description, das uns hierbei aus der Patsche hilft.
Also, wie geht das jetzt?
Zuerst müssen wir unseren enum um das Attribut Description ergänzen. Das sieht dann wie folgt aus:
Imports System.ComponentModel ' Wichtig! Public Enum eFileListActionType <Description("Keine")> _ eflatNone = 0 <Description("Komprimieren")> _ eflatCompress = 1 <Description("Für immer löschen")> _ eflatDeleteForever = 2 <Description("In Papierkorb verschieben")> _ eflatRecyclebin = 3 <Description("Durch Textdatei mit Link ersetzen")> _ eflatReplaceWithTextfile = 4 <Description("Durch Dateilink ersetzen")> _ eflatReplaceWithLink = 5 <Description("Durch 0-Byte Datei ersetzen")> _ eflatReplaceWithZeroByteFile = 6 <Description("In Verzeichnis verschieben")> _ eflatMoveToDirectory = 7 End Enum
Wie man sieht wird einfach der Tag
Zum Auslesen dieser Werte müssen wir nun Reflection bemühen:
Die erste Funktion gibt uns dabei eine Beschreibung für einen Enum-Wert zurück.
Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String Dim fi As Reflection.FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString()) Dim attr() As System.ComponentModel.DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(System.ComponentModel.DescriptionAttribute), False), System.ComponentModel.DescriptionAttribute()) If attr.Length > 0 Then Return attr(0).Description Else Return EnumConstant.ToString() End If End Function
Für folgenden Befehl
Dim str as String = GetEnumDescription(eflatReplaceWithTextfile) Debug.Print(str)
bekämen wir also das als Ausgabe:
Durch Textdatei mit Link ersetzen
Um das ganze noch etwas zu optimieren habe ich noch eine Hilfs-Funktion geschrieben, die alle Werte eines Enums übersetzt (also die Description einliest) und diese in ein String Array schreibt, das man dann einfach an die Combobox übergeben kann.
Public Shared Function GetEnumDescriptions(ByVal EnumConstant As Type) As String() Dim res(-1) As String For Each ec As [Enum] In [Enum].GetValues(EnumConstant) ReDim Preserve res(UBound(res) + 1) res(UBound(res)) = GetEnumDescription(ec) Next Return res End Function
Beispielanwendung:
Me.cbFileActionType.Items.AddRange(GetEnumDescriptions(GetType(eFileListActionType)))
Und damit hätten wir alle Beschreibungen eines Enums sauber in einer Combobox oder Listbox untegebracht.
0 Antworten zu HowTo: VB .NET Enums mit Beschreibungen versehen