Motivation

Die DisplayNameAttribute-Klasse kann nicht auf Felder von Enumerationstypen angewandt werden. Das mit dieser Klasse verbundene Verwendungsattribut AttributeUsageAttribute verbietet dies. Eine benutzerfreundlich oder gar lokalisierte Anzeige dieser Werte in einem PropertyGrid-Steuerelement ist deshalb nicht möglich.

Beispiel. Ein Enumerationstyp für Repräsentation von Baudraten für eine RS232-Schnittstelle könnte wie folgt aussehen:

Public Enum BaudRates
   B_100 = 100
   B_300 = 300
   ' ...
   B_19200 = 19200
   B_38400 = 38400
End Enum

Class Demo
  Public Property BaudRate As BaudRates
End Class

 Wird dieser Typ nun in einem PropertyGrid angezeigt, wird "B_100", "B_300" usw. ausgegeben:

Anzeige von Enumerationsfeldern im PropertyGrid

Schöner wäre die Anzeige von "100" oder "300". Aber auf Grund der Syntax-Regeln müssen Namen mit einem Buchstaben beginnen. "B_300" ist als Name erlaubt, "300" nicht. Ja nach Anwendungsfall wäre auch eine lokalisierte Variante wünschenswert.

Für andere, im PropertyGrid angezeigte Elemente gibt es die Klasse DisplayNameAttribute, mit der die Anzeige angepasst werden kann. Für Felder in Enumerationstypen steht diese Option leider nicht zur Verfügung.

Die Klasse UrsDisplayNameAttribute in Kombination mit dem Type-Converter UrsExtendedEnumConverter schafft hier Abhilfe. Die ressourcengebundene und damit lokalisierte Variante UrsRSDisplayNameAttribute wird hier beschrieben.

Download

Verwendung

UrsExtendedEnumConverter

Der TypeConverter UrsExtendedEnumConverter ist von der Klasse EnumConverter abgeleitet. EnumConverter übersetzt den Feldnamen (als String) ein Enumerationstyps in den Feldwert (als Integer) und vice versa. Im obigen Beispiel wäre dies "B_100" <-> 100. UrsExtendedEnumConverter wertet zusätzlich ein DisplayNameAttribute oder eine davon abgeleitete Klasse (also z.B. UrsDisplayNameAttribute  oder UrsRSDisplayNameAttribute ) aus.

UrsExtendedEnumConverter muss entweder dem Enumerationstyp oder einer Eigenschaft (Property) vom Typ eines Enumerationstyps als TypeConverter zugeordnet werden. Also entweder

<TypeConverter(GetType(UrsExtendedEnumConverter))>
Public Enum BaudRates
   B_100 = 100
   B_300 = 300
   ' ...
   B_19200 = 19200
   B_38400 = 38400
End Enum

oder

Class Demo
  <TypeConverter(GetType(UrsExtendedEnumConverter))>
  Public Property BaudRate As BaudRates
End Class

Ist dies geschehen, können die Enumerationsfelder mit dem Attribut UrsDisplayNameAttribute versehen werden.

<TypeConverter(GetType(UrsExtendedEnumConverter))>
Public Enum BaudRatesAsNumbers
   <UrsDisplayName("100")> B_100 = 100
   <UrsDisplayName("300")> B_300 = 300
   ' ...
   <UrsDisplayName("19200")> B_19200 = 19200
   <UrsDisplayName("38400")> B_38400 = 38400
End Enum

Die Anzeige im PropertyGrid sieht nun wie folgt aus:

Anzeige von 'übersetzten' Enumerationsfeldern im PropertyGrid

Leerzeichen sind an jeder Stelle der Texte erlaubt. Durch eine entsprechende Anzahl zu Begin der Zeichenfolgen lässt sich die Bündigkeit beinflussen.

WICHTIG: Die mit UrsDisplayName vergebenen Ersatztexte müssen innerhalb des Typs eindeutig sein. Ansonsten funktioniert die Rückumwandlung nicht eiwandfrei!

UrsDisplayNameAttribute

Die Klasse UrsDisplayNameAttribute ist direkt von der Klasse DisplayNameAttribute abgeleitet und hat als einige Anpassungen eine Verwendungserweiterung erfahren (AttributeUsageAttribute( .. OR AttributeTargets.Field))