2008-09-11 12 views
16

J'ai actuellement un cours et j'essaie de créer une interface graphique simple pour créer une collection de cette classe. La plupart des attributs de cette classe sont des chaînes. Cependant, l'un des attributs que je souhaite que l'utilisateur puisse définir est un Enum. Par conséquent, je voudrais que l'interface utilisateur, pour avoir une liste déroulante pour cette énumération, pour empêcher l'utilisateur d'entrer une valeur qui n'est pas valide. Actuellement, je prends la liste initiale des objets, en les ajoutant à un DataTable et en définissant la DataSource de mon DataGridView à la table. Fonctionne bien, crée même une colonne de case à cocher pour la propriété booléenne. Mais, je ne sais pas comment faire de la colonne pour l'énumération dans une liste déroulante. J'utilise C# et .NET 2.0.Créer des options de liste déroulante à partir de enum dans un DataGridView

En outre, j'ai essayé d'affecter la DataSource de DataGridView à la liste de mes objets, mais quand je fais cela, cela n'aide pas avec l'énumération et je suis incapable de créer de nouvelles lignes dans DataGridView, mais Je ne suis certainement pas obligé d'utiliser un DataTable comme DataSource, c'était simplement l'option que j'ai semi-travail.

Répondre

34

Je ne sais pas si cela pourrait fonctionner avec une colonne DataGridView mais il fonctionne avec ComboBoxes:

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

et:

MyEnum value = (MyEnum)comboBox1.SelectedValue; 

MISE À JOUR: Il fonctionne avec des colonnes DataGridView aussi, rappelez-vous de Définir le type de valeur.

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

Comment/Où accéder à comboBox1? – ssal

3

Ou, si vous devez faire un certain filtrage des valeurs de recenseur, vous pouvez boucle à travers Enum.GetValues ​​(typeof (EnumeratorName)) et ajoutez ceux que vous voulez en utilisant:

dataGridViewComboBoxColumn.Items.Add(EnumeratorValue) 

Comme à part, plutôt que d'utiliser un DataTable, vous pouvez définir le DataSource de DataGridView à un objet BindingSource, avec la DataSource de l'objet BindingSource définie sur une BindingList < votre classe >, que vous remplissez en passant un IList dans le constructeur.

En fait, je serais intéressé de savoir si cela est préférable d'utiliser un DataTable dans des situations où vous n'en avez pas déjà un (c'est-à-dire qu'il est renvoyé d'un appel de base de données).