2008-09-11 7 views
16

Ich habe derzeit eine Klasse und ich versuche, eine einfache GUI zum Erstellen einer Sammlung dieser Klasse zu erstellen. Die meisten Attribute dieser Klasse sind Strings. Eines der Attribute, das der Benutzer festlegen können soll, ist jedoch ein Enum. Daher möchte ich, dass die Benutzeroberfläche über eine Dropdownliste für diese Enumeration verfügt, die den Benutzer daran hindert, einen ungültigen Wert einzugeben. Zurzeit nehme ich die erste Liste von Objekten, füge sie zu einer DataTable hinzu und setze die DataSource meiner DataGridView auf die Tabelle. Funktioniert gut, erstellt sogar eine Checkbox-Spalte für die eine boolesche Eigenschaft. Aber ich weiß nicht, wie ich die Spalte für das Enum in eine Dropdown-Liste umwandeln soll. Ich benutze C# und .NET 2.0.Erstellen Dropdown-Listenoptionen aus enum in einem DataGridView

Auch habe ich versucht, die DataSource der DataGridView auf die Liste meiner Objekte zuweisen, aber wenn ich dies tun, hilft es nicht mit der Enumeration und ich kann nicht neue Zeilen in der DataGridView erstellen, aber Ich bin definitiv nicht verpflichtet, eine DataTable als meine DataSource zu verwenden, es war einfach die Option, die ich halb arbeite.

Antwort

34

Ich weiß nicht, ob das mit einem Datagridview-Spalte funktionieren würde, aber es funktioniert mit Comboboxen:

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)); 

und:

MyEnum value = (MyEnum)comboBox1.SelectedValue; 

UPDATE: Es arbeitet mit Datagridview-Spalten zu, nur nicht vergessen zu Legen Sie den Werttyp fest.

DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn(); 
col.Name = "My Enum Column"; 
col.DataSource = Enum.GetValues(typeof(MyEnum)); 
col.ValueType = typeof(MyEnum); 
dataGridView1.Columns.Add(col); 
+0

Wie/wo Zugriff auf ComboBox1 erhalten? – ssal

3

Oder, wenn Sie eine Filterung der Aufzählungswerte tun müssen, können Sie eine Schleife durch Enum.GetValues ​​(typeof (EnumeratorName)) und fügen Sie die, die Sie wollen mit:

dataGridViewComboBoxColumn.Items.Add(EnumeratorValue) 

Wie Anstatt eine DataTable zu verwenden, können Sie die DataSource der DataGridView auf ein BindingSource-Objekt festlegen, wobei die DataSource des BindingSource-Objekts auf eine BindingList < Your Class > gesetzt wird, die Sie ausfüllen, indem Sie eine IList in den Konstruktor übergeben.

Eigentlich wäre ich interessiert von jedem zu wissen, ob dies besser ist als die Verwendung einer DataTable in Situationen, in denen Sie noch keine haben (d. H. Sie wird von einem Datenbankaufruf zurückgegeben).