Enum als Datasource für DataGridViewComboBoxColumn im DataGridView verwenden

Vor längerer Zeit habe ich in diesem Artikel berichtet wie man enum Werte über die DataSource Eigenschaft an eine Combobox binden kann.

Hier eine Darstellung einer solchen Bindung in einer normalen Windows Form:

Will man nun aber enum Werte in einem DataGridview an eine, als Combobox definierte, Spalte (DataGridViewComboBoxColumn) binden, geht das nicht ganz so einfach, und eben nicht so wie es in meinem oben erwähnten Artikel beschrieben ist.

Das Ergebnis soll so aussehen:

Wer schon einmal eine solche Tabelle programmiert hat, weiß, dass man nachdem man die DataSource Eigenschaft der DataGridViewComboBoxColumn zugewiesen hat, noch den ValueMember und den DisplayMember angeben muss (Siehe nachfolgende Abbildung).

Da wir die DataSource Eigenschaft bei der enum Variante über den Source Code zuweisen (es geht auch anders, dazu evtl. zu einem späteren Zeitpunkt mal mehr), müssen wir natürlich auch die beiden Eigenschaften  DisplayMember und ValueMember aus dem Quellcode heraus zuweisen.

Nur wie heißen die denn ?

Und genau hier liegt das Problem, bzw. die hier beschriebene Lösung.

Diese Eigenschaften gibt es bei der ursprünglich von mir beschriebenen Lösung nicht.

Und daher müssen wir uns solche Eigenschaften bilden. Hierzu verwenden ich eine Helper Klasse die das notwendige implementiert. (Siehe nachfolgenden Source Code)

Hier nun der Code der Klassen

[Serializable]
public class EnumHelper
{
	public int Key { get; set; }
	public string Value { get; set; }

	public static IEnumerable<ValueListItem> CreateDataSourceFromEnum(Type t)
	{
		var list = new List<ValueListItem>();

		Array aEnum = Enum.GetValues(t);
		foreach (var array in aEnum)
		{
			var vi = new ValueListItem
						 {
							 Key = (int) array,
							 Value = array.ToString()
						 };

			list.Add(vi);
		}
		return list;
	}

	public static IEnumerable<EnumHelper> DataSourceFromEnum(Type t)
	{
		var list = new List<EnumHelper>();

		Array aEnum = Enum.GetValues(t);
		foreach (var array in aEnum)
		{
			var vi = new EnumHelper
						 {
							 Key = (int) array,
							 Value = array.ToString()
						 };

			list.Add(vi);
		}
		return list;
	}

}

[Serializable]
public class ValueListItem
{
	public int Key { get; set; }
	public string Value { get; set; }
}

Und so kann man die Helper Klasse verwenden um die DataSource Eigenschaft sowie die ValueMember und DisplayMember Eigenschaften zuzuweisen.

private void InitDgv()
{
	bereichDataGridViewTextBoxColumn.DataSource = EnumHelper.DataSourceFromEnum(typeof(EntladungsTyp));
	bereichDataGridViewTextBoxColumn.DisplayMember = "Value";
	bereichDataGridViewTextBoxColumn.ValueMember = "Key";
}

Wichtiger Hinweis

Ich verwende diese Klasse bereits seit mehreren Jahren und weiß nicht mehr genau ob ich von irgend jemand etwas übernommen und überarbeitet habe, oder ob ich das im stillen Kämmerchen ausgebrütet habe.
Eine kurze Recherche im Internet hat keine direkten Ergebnisse / Quellen hervorgebracht. Es gibt zwar einige Beiträge die sich auch mit enum Helper Klassen beschäftigen, aber die, welche ich gerade gesehen habe, beschäftigen sich nicht genau mit dem von mir hier beschriebenen Thema, so dass ich zur Zeit keine Angaben über eventuelle Quellen, die mich inspiriert haben könnten, machen kann.

Aber wenn jemand erkennt dass ich Code von wem auch immer verwendet habe, hinterlasst dass bitte in einem Kommentar, so dass sich eventuell fehlende Quellnachweise schließen.