2010-11-20 11 views
0

Es sei zu haften habe ich mehrere Aufzählungen repräsentieren ... zum Beispiel Datenbankanbieter: Unknown, Oracle, Sybase, SQL Server 2005, SQL Server 2008 usw. Ich möchte der Benutzer zwischen allen wählen lassen, diese aber eine Unknown aus einer Combo Box. Wenn der Benutzer eine Aufzählung auswählt, sollte er eine für den Menschen lesbare Beschreibung sehen (die hoffentlich von einem Attribut kommt). Das ausgewählte Objekt sollte jedoch eine Aufzählung dieses spezifischen Typs sein.Wie eine ENUM in eine .NET Windows Forms ComboBox

Dies kann manuell zusammen mit Hilfe von zusätzlichen Wörterbuch gehackt werden, aber ich möchte das nicht tun, und verwenden Sie lieber eine idiomatische und die sauberste Möglichkeit.

Würden Sie bitte ein Codebeispiel oder zumindest einen guten Link teilen?

P.S. Gibt es eine einfache Möglichkeit, eine Sammlung aller Enums des Typs Vendor zu sammeln, mit Ausnahme von Unknown (die einen kurzen/int-Wert von 0 haben wird, wie von Bill Wagner vorgeschrieben)?

+0

möglich Duplikat [? wie habe ich eine enum gebunden Combobox mit benutzerdefinierten String-Formatierung für eNUM-Werte] (http://stackoverflow.com/questions/796607/how -do-ich-habe-ein-Enum-gebunden-Combobox-mit-Custom-String-Formatierung-für-e num-valu) – nawfal

Antwort

4

P.S. Gibt es eine einfache Möglichkeit, eine Sammlung aller Enums des Typs "Vendor" zu erhalten, mit Ausnahme von "Unknown" (mit einem kurzen/int-Wert von 0, wie von Bill Wagner vorgeschrieben)?

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .ToArray(); 

Um einen angezeigten Namen auf die Werte zuordnen, können Sie DescriptionAttribute verwenden können, wie in this answer gezeigt. Behandeln Sie das Format Ereignis des ComboBox die Beschreibung anzuzeigen:

private void comboBoxVendor_Format(object sender, ListControlConvertEventArgs e) 
{ 
    DbVendor vendor = (DbVendor)e.ListItem; 
    e.Value = vendor.GetDescription(); 
} 

Hinweis: Wenn Ihre Anwendung lokalisierbar sein muss, das Description Attribut ist wahrscheinlich nicht die beste Option. Stattdessen könnten Sie String-Ressourcen mit Namen wie DisplayName_DbVendor_Oracle, DisplayName_DbVendor_SqlServer etc. verwenden Sie können dann für einen Wert der Anzeigenamen wie folgt abrufen:

DbVendor vendor = ...; 
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor); 

EDIT: wenn Sie die Werte nach Beschreibung sortieren müssen , nur die LINQ-Abfrage wie folgt ändern:

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .OrderBy(v => v.GetDescription()) 
         .ToArray(); 
+0

+1 Schöne Antwort, danke! –

+0

Einige Follow-ups: A) Muss ich die "IEnumerable" -Enums zu einem Array materialisieren, bevor ich es zur Laufzeit in ein WinForm-Kombinationsfeld einspeisen kann? B) Bei der Bestellung dieser Artikel - wird die Liste der enums die Reihenfolge beibehalten, in der sie deklariert wurden? Wenn ich explizit nach der Beschreibung sortieren möchte, wie müsste ich dann diese LINQ-Abfrage ändern? –

+1

A) Ich bin nicht sicher, wie es funktionieren würde, wenn Sie IEnumerable direkt der DataSource zugewiesen haben ... Normalerweise verwende ich ToArray oder ToList, um sicherzustellen, dass die Abfrage nur einmal ausgeführt wird. B) sehe meine Bearbeitung –

Verwandte Themen