Enum benennen und Beschreibung eines Enum in einer ComboBox ausgeben

Machmal kommt es vor, dass man die Werte eines Enumerators als String darstellen will. In der Regel wird vom Framework bei der Verwendung von ToString() einfach der deklarierte Name des Wertes ausgegeben. Möchte man nun, dass Anstelle des Namens eine eigene Definition angezeigt wird, könnte man auf die Idee kommen ToString() zu überschreiben. Das funktioniert aber nicht. Stattdessen muss man auf sog. DescriptionAttribute zurückgreifen.

using System.Reflection;
using System.ComponentModel;

public enum ESortOrder
{
    [Description("aufsteigend")] // Beschreibungstext für Asc
    Asc,
    [Description("absteigend")] // Beschreibungstext für Desc
    Desc
}

cbSortOrder.Items.Clear();

// alle Elemente des ESortOrder-Enums durchgehen und zugehörige
// Description ("aufsteigend", "absteigend") herausfiltern und
// in der Combobox "cbSortOrder" ausgeben
// [Description( ... )] muss für jedes Enum definiert sein,
// sonst Exception beim Zugriff auf attributes[0]
foreach (ESortOrder val in Enum.GetValues(typeof(ESortOrder)))
{
    FieldInfo fi = val.GetType().GetField(val.ToString());
    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

    cbSortOrder.Items.Add(attributes[0].Description);
}

cbSortOrder.SelectedIndex = 0;
  • Weiterführendes Beispiel: Link

Auswählen von ListView SubItems mittels ComboBox

// auf dem Formular befindet sich ein ListView mit Namen ListView1
public partial class Form1 : Form
{
    // die Combobox mit der Editiert wird
    private ComboBox _cbEdit = new ComboBox();
    
    // Verweise auf das ListViewElement
    private ListViewItem.ListViewSubItem _lvSubItemEdit = null;
    
    public frmMain()
    {
        InitializeComponent();
        
        // ComboBox initialisieren
        _cbEdit.Visible = false;
        // Werte nur anzeigen, kein Editieren zulassen
        _cbEdit.DropDownStyle = ComboBoxStyle.DropDownList;
        // Eventhandler für die Textbox hinzufügen
        _cbEdit.Leave += new EventHandler(_cbEdit_Leave);

        // ein paar Beispielwerte
        _cbEdit.Items.Add("0.5");
        _cbEdit.Items.Add("0.8");
        _cbEdit.Items.Add("0.9");

        // der Form hinzufügen
        this.Controls.Add(_cbEdit);
    }
   
    // Event für das Verlassen der Combobox per Maus
    void _cbEdit_Leave(object sender, EventArgs e)
    {
        if (_lvSubItemEdit != null)  
        {
            if (_cbEdit.SelectedItem != null)
            {
                _lvSubItemEdit.Text = _cbEdit.SelectedItem.ToString();
            }
        }

        _cbEdit.Visible = false; 
    }

    // Event des ListViews
    // zum Merken des zuletzt angeklickten ListViewItems
    // und zum Plazieren der Combobox
    private void ListView1_MouseUp(object sender, MouseEventArgs e)
    {
        ListViewHitTestInfo htInfo = ListView1.HitTest(e.X, e.Y);
        if (htInfo != null)
        {
            if (htInfo.Item != null && htInfo.SubItem != null)
            {
                // wenn Subitem in Spalte 2 (Index == 1) gewählt
                // dann ComboBox anzeigen
                if (htInfo.Item.SubItems.IndexOf(htInfo.SubItem) == 1)
                {
                    _lvSubItemEdit = htInfo.SubItem;

                    _cbEdit.Top = ListView1.Top + _lvSubItemEdit.Bounds.Top + 2;
                    _cbEdit.Left = ListView1.Left + _lvSubItemEdit.Bounds.Left + 2;

                    _cbEdit.Width = _lvSubItemEdit.Bounds.Width;
                    _cbEdit.Height = _lvSubItemEdit.Bounds.Height;

                    _cbEdit.SelectedIndex = _cbEdit.Items.IndexOf(_lvSubItemEdit.Text);

                    _cbEdit.Visible = true;
                    _cbEdit.BringToFront();
                    _cbEdit.Focus();
                }
                else
                {
                    _lvSubItemEdit = null;
                }
            }
        }
    }
}

Systemfarben (KnownColors) in ComboBox anzeigen

private void Form1_Load(object sender, EventArgs e)
{
    // wichtige Einstellungen für die 2 ComboBoxen
    comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    comboBox2.DrawMode = DrawMode.OwnerDrawFixed;
    comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;

    // alle bekannte Farben im System in ein Array schreiben
    Array caKnown = Enum.GetValues(typeof(System.Drawing.KnownColor));

    foreach (KnownColor kC in caKnown)
    {
        Color curC = Color.FromKnownColor(kC);

        // wenn Systemfarbe, dann in ComboBox 1
        if (curC.IsSystemColor)
        {
            // Systemfarben
            comboBox1.Items.Add(curC.Name.ToString());
        }
        else
        {
            // restl. Farben in ComboBox 2
            comboBox2.Items.Add(curC.Name.ToString());
        }
    }
}

// diese Funktion sollte jeder der 2 Comboboxen zugewiesen werden (DrawItem)
private void comboBox_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index >= 0)
    {
        ComboBox cboBox = sender as ComboBox;

        if (cboBox != null)
        {
            // links einen Bereich definieren, wo die Farbe angezeigt wird
            Rectangle rc_left = new Rectangle(e.Bounds.X, e.Bounds.Y, 20, e.Bounds.Height);
            // rechts einen Bereich definieren, wo der Name angezeigt wird
            Rectangle rc_right = new Rectangle(e.Bounds.X + 20, e.Bounds.Y, e.Bounds.Width - 20, e.Bounds.Height);

            // akt. Farbe zum Namen heraussuchen
            KnownColor K = (KnownColor)System.Enum.Parse(typeof(KnownColor), cboBox.Items[e.Index].ToString());
            Color C = System.Drawing.Color.FromKnownColor(K);

            // kl. Rahmen um den Eintrag zeichnen
            e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.White), 2), rc_left);

            // links das Kästchen für die Hintergrundfarbe anzeigen
            e.Graphics.FillRectangle(new SolidBrush(C), rc_left);

            // rechts den Text (Farbnamen) anzeigen
            e.Graphics.DrawString(cboBox.Items[e.Index].ToString(), new Font("Ariel", 8), new SolidBrush(Color.Black), rc_right, StringFormat.GenericDefault);
        }
    }
}